MSXML应用总结 开发篇(下)
2016-01-14 17:23
411 查看
转载地址:http://blog.sina.com.cn/s/blog_48f93b530100eq4b.html
三、查询XML文档节点
这部分属于“读”XML文档并做节点遍历,由于担心加上实例会占用过多的篇幅影响阅读,先在这篇做方法总结,以后有时间再写一篇“实战篇”专门写个实例工程,可以有更完整的参考代码。
查询和遍历XML文档的大致步骤:创建IXMLDOMDocument接口对象 -> load加载文档 -> 得到root节点 -> 依次遍历各节点。也可以通过IXMLDOMDocument接口的selectSingleNode或selectNodes函数分别得到指定节点或节点集合
四、创建或修改XML文档节点
这部分属于“写”XML文档,大致的步骤是:创建IXMLDOMDocument接口对象 -> 创建root节点并添加到document上 -> 依次创建所需类型的节点并添加到父节点。对于修改已有XML文档节点,只需要按照上面查询节点的方法找到该节点,用get相对应的put函数修改即可。下面主要介绍一下创建的详细过程。
这篇就总结这些,希望对大家有所帮助;如果有写的不对之处,请不吝赐教。
三、查询XML文档节点
这部分属于“读”XML文档并做节点遍历,由于担心加上实例会占用过多的篇幅影响阅读,先在这篇做方法总结,以后有时间再写一篇“实战篇”专门写个实例工程,可以有更完整的参考代码。
查询和遍历XML文档的大致步骤:创建IXMLDOMDocument接口对象 -> load加载文档 -> 得到root节点 -> 依次遍历各节点。也可以通过IXMLDOMDocument接口的selectSingleNode或selectNodes函数分别得到指定节点或节点集合
1、查询文档中指定节点 MSXML2::IXMLDOMNodePtr pNode = pXmlDoc->selectSingleNode(L"root/record"); if(pRootNode == NULL) { //fail process } selectSingleNode函数允许用过类似路径的XPath方式查询节点,返回第一个符合的节点。
2、查询节点集合 MSXML2::IXMLDOMNodeListPtr pNodeList = pXmlDoc->selectNodes(L"root/record"); if(pNodeList == NULL) { //fail process }与上面方法不同的是,selectNodes函数返回的是一个节点接口指针列表。需要说明的是,这两个函数是IXMLDOMNode接口的函数,因此可以从任一节点进行这样的查询,使用相对调用节点的相对路径即可。如果通过节点的标签名来查询,也可以使用getElementsByTagName函数,该函数不如selectNodes功能丰富,但使用起来比较简单。在IXMLDOMNode和IXMLDOMElement接口中均实现了该函数。
MSXML2::IXMLDOMNodeListPtr pNodeList = pXmlDoc->getElementsByTagName_r("tag name"); if( pNodeList == NULL) { // fail process } int nCount = pNodeList->Getlength(); pNodeList->reset(); for( int i=0; i<nCount; i++) { MSXML2::IXMLDOMNodePtr pNode = pNodeList->Getitem(i); if(pNode) { // node process } }
3、查询节点属性 查询IXMLDOMElement接口节点的某个属性值: _variant_t varValue = pRootNode->getAttribute("attirbute name"); if( varValue.vt != VT_NULL) printf("%s", _bstr_t(varValue)); 或者可以先得到IXMLDOMAttribtute接口,通过接口函数查询属性值: MSXML2::IXMLDOMAttributePtr pAttriNode = pRootNode->getAttributeNode("attirbute name"); if( pAttriNode) { _variant_t varValue; HRESULT hr = pAttriNode->get_nodeval_rue(&varValue); if( SUCCEEDED(hr)) { printf("%s", _bstr_t(varValue)); } } IXMLDOMNode接口类中有attributes成员变量,可以直接拿到节点属性的集合,再通过IXMLDOMNamedNodeMap接口查询属性值: MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = pRootNode->Getattributes(); if( pAttrs) { MSXML2::IXMLDOMNodePtr pNode = pAttrs->getNamedItem("attirbute name"); if( pNode) { _variant_t varValue; HRESULT hr = pNode->get_nodeval_rue(&varValue); if( SUCCEEDED(hr)) printf("%s", _bstr_t(varValue)); } } 也可以通过IXMLDOMNamedNodeMap的元素遍历来查询。
4、查询节点内容 从IXMLDOMNode继承的接口都可以直接查询节点内容: _bstr_t bstrText = pNode->Gettext(); printf("%s", bstrText); 若节点类型是CDATA SECTION,则Gettext函数返回的是CDATA的文本内容;若为Comment类型则返回注释内容。
5、查询节点名称 对于元素类型节点或者属性节点,有时需要查询其标签名或者属性名,可以用IXMLDOMNode接口函数: _bstr_t bstrName = pNode->GetnodeName(); printf("%s", bstrName); 注意GetnodeName函数对于不同类型的节点得到的名称种类是不同的,具体可参考MSDN。
四、创建或修改XML文档节点
这部分属于“写”XML文档,大致的步骤是:创建IXMLDOMDocument接口对象 -> 创建root节点并添加到document上 -> 依次创建所需类型的节点并添加到父节点。对于修改已有XML文档节点,只需要按照上面查询节点的方法找到该节点,用get相对应的put函数修改即可。下面主要介绍一下创建的详细过程。
1、创建节点 下面是document添加root节点的代码: MSXML2::IXMLDOMElementPtr pRootNode = pXmlDoc->createElement_x("root"); pXmlDoc->appendChild(pRootNode); 一般情况下,创建节点的步骤都是由IXMLDOMDocument接口对象create一个类型节点出来,然后由父节点接口对象调用appendChild函数将创建节点添加上去。总结一下创建各类型节点接口的方法: IXMLDOMAttribute :createAttribute IXMLDOMCDATASection :createCDATASection IXMLDOMComment :createComment IXMLDOMDocumentFragment :createDocumentFragment IXMLDOMElement :createElement_x IXMLDOMEntityReference :createEntityReference IXMLDOMProcessingInstruction :createProcessingInstruction IXMLDOMText :createTextNode 另外还有一个createNode函数可以创建指定类型的节点。
2、设置创建节点各种类型值 下面是设置一个节点的内容代码: MSXML2::IXMLDOMNodePtr pNode = pXmlDoc->createElement_x("title"); if( pNode) { pNode->Puttext("title text"); pRootNode->appendChild(pNode); } 只需要调用各类型接口对应的put函数进行设置就可以了。
3、设置创建节点的属性 两种方法,一种是先添加IXMLDOMElement类型节点再设置属性: _variant_t varLanguage = "chinese"; HRESULT hr = pRootNode->setAttribute("language", varLanguage); ASSERT(SUCCEEDED(hr)); 另一种是直接添加IXMLDOMAttribute类型节点: MSXML2::IXMLDOMAttributePtr pAttribute = pXmlDoc->createAttribute("language"); if(pAttribute) { _variant_t varLanguage = "chinese"; pAttribute->Putvalue(varLanguage); pRootNode->setAttributeNode(pAttribute); }
4、插入节点 插入节点可以用insertBefore函数,代码如下: MSXML2::IXMLDOMElementPtr pNewElement = pXmlDoc->createElement_x("date"); if( pNewElement) { HRESULT hr = pRootNode->insertBefore(pNewElement, (_variant_t)pRootNode->GetchildNodes()->Getitem(1)); ASSERT(SUCCEEDED(hr)); } 对于不同类型的节点,此函数要求插入的节点类型和返回值类型都有比较复杂的规范,具体可以参考MSDN,在此不详细介绍了。
5、 删除节点 对于不同类型的节点接口,有不同的remove函数可以删除节点,总结如下: IXMLDOMElement : removeAttribute,removeAtrributeNode IXMLDOMNamedNodeMap : removeNamedItem IXMLDOMAttribute,IXMLDOMComment,IXMLDOMDocument,IXMLDOMDocumentFragment,IXMLDOMElement,IXMLDOMNode,IXMLDOMText : removeChild 示例代码: MSXML2::IXMLDOMElementPtr pRootNode = pXmlDoc->documentElement; pRootNode->removeAttribute("languge");
这篇就总结这些,希望对大家有所帮助;如果有写的不对之处,请不吝赐教。
相关文章推荐
- matlab归一化&标准化
- 【BZOJ 2038】 [2009国家集训队]小Z的袜子(hose)
- linux分区和目录相关知识
- web.xml配置详解
- ubuntu virtualbox安装win10虚拟机 共享文件夹
- Ionic基础——js指令布局
- 哈理工OJ 1037组合数末尾的零(思维)
- mysql中处理逗号存储多个字符串,id,tag
- string 转 json数据
- [Leetcode]@python 73. Set Matrix Zeroes
- 块状链表 bzoj 3343教主的魔法
- yii2 renderPartial
- Linux curses 总结三(对键盘的操作)
- MySQL存储引擎总结
- 可行性分析
- 《JAVA与模式》之模板方法模式
- MySQL MERGE存储引擎 简介
- Microsoft Windows 系统上安装Node.js
- @PathVariable-------springMVC
- curl_setopt(ch, option, value)函数上传文件