45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:在VC中实现MSXML DOM应用的方法

在VC中实现MSXML DOM应用的方法

2016-08-30 14:52:54 来源:www.45fan.com 【

在VC中实现MSXML DOM应用的方法

已知变量

MSXML2::IXMLDOMDocument*pDoc;

MSXML2::IXMLDOMNode*pChild,*pParent;

MSXML2::IXMLDOMNode*pNod;

MSXML2::IXMLDOMElement*pEle;

初始化指针:

MSXML2::IXMLDOMDocument*pDocument=NULL;

MSXML2::IXMLDOMNodeList*pNodeList=NULL;

MSXML2::IXMLDOMNamedNodeMap*pNodeMap=NULL;

MSXML2::IXMLDOMNode*pNode=NULL

MSXML2::IXMLDOMText*pText=NULL;

MSXML2::IXMLDOMElement*pElement=NULL;

MSXML2::IXMLDOMProcessingInstruction*pProcessingInstruction=NULL;

MSXML2::IXMLDOMComment*pComment=NULL;

MSXML2::IXMLDOMParseError*pObjError=NULL;

已知数据:

BSTRbstrText,bstrName;

inttype;

**)创建新文档

//hr=CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,

//IID_IXMLDOMDocument,(void**)&m_pXMLDoc);

HRESULThr=CoCreateInstance(__uuidof(MSXML2::DOMDocument40),NULL,CLSCTX_INPROC_SERVER,

__uuidof(MSXML2::IXMLDOMDocument),(void**)&m_pXMLDoc);

hr=pDocument->put_async(VARIANT_FALSE);

hr=pDocument->put_validateOnParse(VARIANT_FALSE);

hr=pDocument->put_resolveExternals(VARIANT_FALSE);

a)添加子节点到父节点

pParent->appendChild(pChild,&pNode)

b)创建节点

VARIANTvtype;

vtype.vt=VT_I4;

V_I4(&vtype)=(int)type;

pDoc->createNode(vtype,bstrName,NULL,&pNode);

c)创建元素节点

pDoc->createElement(bstrName,pElement);

(pElement)->put_text(bstrText);

d)创建文本子节点,并添加到父节点中

pDoc->createTextNode(bstrText,&pText);

pParent->appendChild(pText,&pNode)

e)创建//Createaprocessinginstructionelement.

BSTRbstrTarget=SysAllocString(L"xml");

BSTRbstrData=SysAllocString(L"version='1.0'");

pDoc->createProcessingInstruction(bstrTarget,bstrData,&pProcessingInstruction);

SysFreeString(bstrTarget);

SysFreeString(bstrData);

f)创建注释节点

pDoc->createComment(bstrText,&pComment);

g)元素节点属性值

得到属性值

VARIANTv;

pEle->getAttribute(bstrName,&v);

CStringstr=v.bstrVal;

设置属性值

CComVariantv(str);

pEle->setAttribute(bstrName,v);

h)节点属性值

VARIANTv;

CStringstr;

longmCount;

得到节点属性集

hr=pNod->get_attributes(&pNodeMap);

hr=pNodeMap->get_length(&mCount);

得到节点属性

hr=pNodeMap->getNamedItem(bstrName,&pNode);

pNodeMap->get_item(i,&pNode);

得到节点属性值

hr=pNode->get_nodevalue(&v);

str=v.bstrVal;

删除节点属性

MSXML2::IXMLDOMNode*moldNode;

mNodeMape->removeNamedItem(bstrName,&moldNode);

if(moldNode!=NULL)moldNode->Release();

i)节点

(1)得到节点、节点集

根据节点名称

pDoc->getElementsByTagName(bstrName,&pNodeList);

pNodeList->get_item(0,&pNode);

得到子节点集

hr=pNod->get_childNodes(&mNodeList);

longmCount;

MSXML2::IXMLDOMNode*pNodeSub;

mNodeList->get_length(&mCount);

hr=pNode->get_firstChild(&pNodeSub);

删除子节点(包含删除节点属性、子节点、当前节点)

删除当前子节点

pNodeList->get_item(i,&pNode);

pNod->removeChild(pNode,&moldNode);

moldNode->Release();

(2)根据节点得到节点名称

pNod->get_nodeName(&bstrName);

(3)根据节点得到节点值

VARIANTv;

hr=pNod->get_nodevalue(&v);

j)XML文件操作

加载

VARIANT_BOOLstatus;

VARIANTvFileName;

(1)

pDoc->loadXML(bstrName,&status);

(2)

V_BSTR(&vFileName)=strFileName.AllocSysString();

V_VT(&vFileName)=VT_BSTR;

vResult=pDoc->load(vFileName,&status);

保存

BSTRpBFName=mFileName.AllocSysString();

CComVariantv(pBFName);

hr=pDoc->save(v);

BSTRbstr=NULL;

pDoc->get_xml(&bstr);

k)错误处理

BSTRbstr=NULL;

pDoc->get_parseError(&pObjError);

pObjError->get_reason(&bstr);

AfxMessageBox(_T("FailedtoloadDOMfrombooks.xml.%S/n"),*bstr);

=======================88888888888=======================================

现在XML文档应用的方面特别的多.

我把以前写过的一个例子帖出来,以备以后使用.

第一部分:DOM解析:

概述:DOM解析将会把一个完整的XML文档读进来,生成一个结构树。这样会要把XML文档全部都加载到内在中。所以解析起来的速度会要慢一些。

1、如何加载xml文件:

//创建DOM,加载XML文档

MSXML::IXMLDOMDocumentPtr pCommandDoc;

pCommandDoc.CreateInstance(__uuidof(MSXML::DOMDocument));

pCommandDoc->put_async(VARIANT_FALSE);

pCommandDoc->put_validateOnParse(VARIANT_FALSE);

pCommandDoc->put_resolveExternals(VARIANT_FALSE);

pCommandDoc->put_preserveWhiteSpace(VARIANT_TRUE);

pCommandDoc->load(file.GetBuffer(0));

2、在XML文档中查找指定的结点:

//找到

MSXML::IXMLDOMNodePtr pRootNode=pCommandDoc->selectSingleNode("root/record");

if (pRootNode==NULL)

{

return ;

}

3、得到XML文档中,结点的属性

CString strTemp;

MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;

pRootNode->get_attributes(&pAttrs);

if (pAttrs==NULL)

{

return;

}

MSXML::IXMLDOMNodePtr pRequestTypeAttr=pAttrs->getQualifiedItem("name","");

_bstr_t strRequestType=pRequestTypeAttr->Gettext();

strTemp=strRequestType.operator char *();

4、得到结点的内容

_bstr_t strVisiPort=pNode->Gettext();

5、设置结点的内容

HRESULT hr=pNode->put_text(_bstr_t(m_strGatewayPassword));

 

本文地址:http://www.45fan.com/a/question/69859.html
Tags: 一些 DOM MSXML
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部