读书人

怎么使用MSXML读XML

发布时间: 2013-10-27 15:21:50 作者: rapoo

如何使用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

读书人网 >C++

热点推荐