首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么使用MSXML读XML

2013-10-27 
如何使用MSXML读XML?XML内容为root1root2data111111/data1data222222/data2/root2root2d

如何使用MSXML读XML?
XML内容为
<root1>
   <root2>
       <data1>11111</data1>
       <data2>22222</data2>
   </root2>
   <root2>
       <data1>33333</data1>
       <data2>44444</data2>
   </root2>
   <root2>
       <data1>55555</data1>
       <data2>66666</data2>
   </root2>
      .
      .
</root1>


请问如何获取到这些值?网上找了代码能获取到但是我修改的时候估计是指针指向的问题,总是失败。谁能帮我看看怎么改

::CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr pDoc;

HRESULT hr =  pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));//创建一个com进程

if(!SUCCEEDED(hr)) 

MessageBox(_T("failure")); 


pDoc->load("XMLTEST.XML");
MSXML2::IXMLDOMNodeListPtr pNodeList = NULL;
pNodeList = pDoc->selectNodes("//root1/root2");
MSXML2::IXMLDOMNodePtr pSubNode;

CString strTemp;
for(int i=0;i<pNodeList->Getlength();i++)
{
pSubNode=pNodeList->nextNode()->selectSingleNode("data1");
_bstr_t strRequestType=pSubNode->Gettext();
strTemp=strRequestType.operator char *();
MessageBox(strTemp);


}
pDoc->save("XMLTEST.XML");
::CoUninitialize();  
[解决办法]
最近因为在做相关的东西,所以才研究了下, 下面的代码基本符合你的要求,不过仍需要根据自己的需求修改.

void ReadXML(MSXML2::IXMLDOMElementPtr pRoot)
{

    MSXML2::IXMLDOMNodeListPtr pNodeList = pRoot->GetchildNodes();
    int nodeCount = pNodeList->length;

    if (nodeCount > 1)
    {
        MSXML2::IXMLDOMElementPtr xmlNode;
        for (int i = 0; i < nodeCount; i++)
        {
            xmlNode = pNodeList->item[i];
            ReadXML(xmlNode);
        }

        xmlNode.Release();
    }
    else
    {
        std::cout << (char*)pRoot->nodeName << ": ";
        VARIANT varVal;
        pRoot->get_nodeTypedValue(&varVal);
        std::cout << (char*)(_bstr_t)varVal << std::endl;
    }
    
    pNodeList.Release();
}

int _tmain(int argc, _TCHAR* argv[])
{
    ::CoInitialize(NULL);

    MSXML2::IXMLDOMDocumentPtr pDoc;
    HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
    if (FAILED(hr))
    {
        return 0;
    }

    if (!pDoc->load("C:\\1.xml"))
    {
        pDoc.Release();
        ::CoUninitialize();
        return 0;
    }
    
    MSXML2::IXMLDOMElementPtr pRoot = pDoc->GetfirstChild();

    ReadXML(pRoot);

    pRoot.Release();
    pDoc.Release();

    ::CoUninitialize();

    system("pause");
return 0;
}


XMl的内容为:
<root1>
  <root2>
    <XXX1>11</XXX1>
    <XXX2>22</XXX2>
  </root2>
  <root3>
    <XXX1>33</XXX1>
    <XXX2>44</XXX2>
  </root3>
  <root3>
    <XXX1>55</XXX1>
    <XXX2>66</XXX2>
  </root3>
</root1>


另外推荐楼主看这几篇, 之后基本的xml操作应该没问题:


http://chuansu.iteye.com/blog/1445628
http://bbs.csdn.net/topics/60016534
http://blog.csdn.net/loveandangle/article/details/6639901

热点排行