您的位置:首页 > 其它

MSXML 解析XML文件

2015-11-18 21:24 375 查看
MSXML 解析XML文件

<msglist>

<data>

<Name>changjiang</Name>

<ID>1</ID>

</data>

<data>

<Name>wang</Name>

<ID>2</ID>

</data>

</msglist>

1.先要#Import<MSXML6.dll>

2.要添加命名空间

3.创建组件两种方式CreateInstance和CoCreateInstance,有的时候直接添加IID时候不能编译通过添加到 __uuidof(MSXML2::DOMDocument60)可以编过

4.设置相关属性 pXmlDoc->put_async(VARIANT_FALSE);

pXmlDoc->put_validateOnParse(VARIANT_FALSE);

pXmlDoc->put_resolveExternals(VARIANT_FALSE);

5.打开xml文件,在网上找的大部分是直接打开xml文件,我的编译不通过可能是用的msxml版本不同吧,

VariantInit( &vXMLSrc );

vXMLSrc.vt = VT_BSTR;

vXMLSrc.bstrVal = SysAllocString(L"test.xml");

设置打开相关文件

6.这样打开的指针式文件的指针我理解的其实每一个《》中的就是一个NODE,这是用文件指针pXmlDoc遍历data node是不可见的

所以要先指定<msglist> node 用selectSingleNode单个node 取得msglist node的指针 然后用selectNodes取得List然后遍历

LIst中的各个属性得到值。

7.这里的请求空间都是传的单*的地址,是在函数内部实现空间的申请的,所以当该指针不用的时候需要释放,调用Release方法。

8.<data Name=“changjiang”, ID = “1”>这种是通过get_attributes获取值的。

#include "stdafx.h"

#include <windows.h>

using namespace MSXML2;

int main(int argc, char* argv[])

{

VARIANT vXMLSrc;

CoInitialize(NULL);

IXMLDOMDocumentPtr pXmlDoc;

IXMLDOMElement *iXMLElm = NULL;

IXMLDOMNodeList *iXMLChild = NULL;

IXMLDOMNode* iXMLItem = NULL;

IXMLDOMNode* iXMLTrmpItem = NULL;

IXMLDOMNode* pAttrTmp=NULL;

IXMLDOMNamedNodeMap *pAttrMap=NULL;

HRESULT hr = pXmlDoc.CreateInstance( __uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER);

pXmlDoc->put_async(VARIANT_FALSE);

pXmlDoc->put_validateOnParse(VARIANT_FALSE);

pXmlDoc->put_resolveExternals(VARIANT_FALSE);

VARIANT_BOOL result;

VariantInit( &vXMLSrc );

vXMLSrc.vt = VT_BSTR;

vXMLSrc.bstrVal = SysAllocString(L"test.xml");

if(pXmlDoc->load(vXMLSrc,&result) != VARIANT_TRUE)

{

pXmlDoc->selectSingleNode(L"msglist",&iXMLItem);

iXMLItem->selectNodes(L"data",&iXMLChild);

// wchar_t* bStr = NULL;

// iXMLItem->get_text(&bStr);

long lLength = 0;

iXMLChild->get_length(&lLength);

for (int x=0;x<lLength;x++)

{

iXMLChild->get_item(x,&iXMLTrmpItem);

// iXMLTrmpItem->get_attributes(&pAttrMap);

// pAttrMap->getNamedItem(L"Name",&pAttrTmp);

wchar_t* bStr = NULL;

iXMLTrmpItem->selectSingleNode(L"Name",&iXMLItem);

iXMLItem->get_text(&bStr);

iXMLItem->Release();

iXMLItem = NULL;

iXMLTrmpItem->selectSingleNode(L"ID",&iXMLItem);

iXMLItem->get_text(&bStr);

// pAttrTmp->get_text(&bStr);

// pAttrMap->getNamedItem(L"ID",&pAttrTmp);

// bStr = NULL;

// pAttrTmp->get_text(&bStr);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: