加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

MSXML 解析XML文件

发布时间:2020-12-16 06:02:38 所属栏目:百科 来源:网络整理
导读:MSXML 解析XML文件 msglist data Namechangjiang/Name ID1/ID /data data Namewang/Name ID2/ID /data /msglist 1.先要#ImportMSXML6.dll 2.要添加命名空间 3.创建组件两种方式CreateInstance和CoCreateInstance,有的时候直接添加IID时候不能编译通过添加到_
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; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读