现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

MFC读取XML文件

2012-07-08 22:03 工业·编程 ⁄ 共 2396字 ⁄ 字号 暂无评论

    在MFC中利用IXMLDOMDocumentPtr类来操作XML格式的文件.

首先:安装msxml.msi,下载地址 

然后:在stdafx.h文件中,加载DLL文件

#import <msxml4.dll>
宏定义一下
#define XMLDocPtr  MSXML2::IXMLDOMDocumentPtr
#define XMLNodePtr  MSXML2::IXMLDOMNodePtr
#define XMLNodeListPtr  MSXML2::IXMLDOMNodeListPtr

下面是封装好的,两个获取节点内容的函数.

//获取XML节点的值,函数类型为void或int,用于获取Cstring的值

void GetXMLNodeValue(XMLNodePtr pNode, LPCTSTR strDesc, CString& strValue)
{
    if (pNode == NULL)
    {
        strValue = "";
        return;
    }
    XMLNodePtr pNodeValue = pNode;
    _variant_t v;
    if (strDesc != "")
        pNodeValue = pNode->selectSingleNode(strDesc);
    if (pNodeValue == NULL)
    {
        strValue = "";
        return;
    }
    v = pNodeValue->GetnodeTypedValue();
    strValue = CString(v.bstrVal);
    SysFreeString(v.bstrVal);
    v.Clear();
}
//获取XML节点的值,函数类型为void或int,用于获取int的值
int GetXMLNodeValue(XMLNodePtr pNode, LPCTSTR strDesc)
{
    if (pNode == NULL)
        return 0;
    _variant_t v;
    XMLNodePtr pNodeValue = pNode;
    CString strValue;
    if (strDesc != "")
        pNodeValue = pNode->selectSingleNode(strDesc);
    if (pNodeValue == NULL)
        return 0;
    v = pNodeValue->GetnodeTypedValue();
    strValue = CString(v.bstrVal);
    SysFreeString(v.bstrVal);
    v.Clear();
    return atoi(strValue);
}

终于到了,真正读取XML文件的时候了。

//创建XML实例
        HRESULT hr;
        XMLDocPtr pDoc;
        hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
        if (FAILED(hr))
        {
            AfxMessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
            break;
        }

CString xmlfilePath = "..\\xxx.xml";
        pDoc->load((LPCTSTR)xmlfilePath);//导入要读取的xml文件

/*若要读取xlm文件的格式为:

<ZCs Data_Familly="DF18">
    <ZC ID="7681" Name="ZC1">
      <SSID>1</SSID>
      <Urbalis_Sector_ID>1</Urbalis_Sector_ID>
      <ZC_Area_ID>1</ZC_Area_ID>
      <CBI_ID_List>
        <CBI_ID>15363</CBI_ID>
        <CBI_ID>15364</CBI_ID>
      </CBI_ID_List>
      <ATS_ID_List>
        <ATS_ID>2561</ATS_ID>
      </ATS_ID_List>
      <Max_SCT_Validity_Distance />
    </ZC>
  </ZCs>*/

    XMLNodePtr pNode = pDoc->selectSingleNode((LPCTSTR)"//ZCs/ZC[@ID='7681']");//获得单个节点的信息
    if (pNode)
    {
        int  id = GetXMLNodeValue(pNode, "@ID");//注意ID这样的位置是要加@的   获取int

         CString CBIname = "";

GetXMLNodeValue(pNode, "@Name", CBIname);//获取CString

      XMLNodeListPtr pList = pNode->selectNodes((LPCTSTR)"CBI_ID_List/CBI_ID");//获得多个节点的信息存放在列表中
for (int j = 0;j < pList->Getlength();j++)//该CBI_ID可能有多个,遍历一下
        {
            XMLNodePtr pNode_CBIId = pList->Getitem(j);
            int bid = GetXMLNodeValue(pNode_CBIId , "");

        }

     }

上面例子就把VC读取XML文件的大部分操作都用到了,总之万变不离其中!

给我留言

留言无头像?