原文:http://blog.sina.com.cn/s/blog_48f93b530100eq4b.html

三、查询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

IXMLDOMAttributeIXMLDOMCommentIXMLDOMDocumentIXMLDOMDocumentFragmentIXMLDOMElementIXMLDOMNodeIXMLDOMText  : removeChild

示例代码:

MSXML2::IXMLDOMElementPtr pRootNode = pXmlDoc->documentElement;

pRootNode->removeAttribute("languge");

这篇就总结这些,希望对大家有所帮助;如果有写的不对之处,请不吝赐教。

【转载】MSXML应用总结 开发篇(下)的更多相关文章

  1. 【转载】MSXML应用总结 开发篇(上)

    原文:http://blog.sina.com.cn/s/blog_48f93b530100ejv9.html 本篇是接前文“MSXML应用总结 概念篇”写的,主要总结一下MSXML DOM接口的应用 ...

  2. 前端开发工程师 - 03.DOM编程艺术 - 第1章.基础篇(下)

    第1章.基础篇(下) Abstract: 数据通信.数据存储.动画.音频与视频.canvas.BOM.表单操作.列表操作 数据通信(HTTP协议) HTTP事务: 客户端向服务器端发送HTTP请求报文 ...

  3. 华清远见金牌讲师名家大讲堂Android开发篇成功举办

    2014年3月5日.12日华清远见金牌讲师名家大讲堂(以下简称名家大讲堂)在线讲座全新升级开讲,至此拉开了新一年名家大讲堂的序幕! 华清远见名家大讲堂作为业内颇具影响力的公益免 费线上课程,自2009 ...

  4. [转]Apache Maven 入门篇(下)

    原文地址: Apache Maven 入门篇(下) 作者:George Ma 第一篇文章大概的介绍了一下Apache Maven以及它的下载和安装,并且运行了一个简单的示例.那么在对maven有了一点 ...

  5. linux一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书)

    一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书) --------------------------目录-网络无关篇-目录-------------------------- 0001 修 ...

  6. 小试ImageMagik——开发篇

    ===================================================== ImageMagick的使用和开发的文章: 小试ImageMagik--使用篇 小试Imag ...

  7. .NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发

    上篇给大家从零开始搭建了一个我们的ASP.NET Core CMS系统的开发框架,具体为什么那样设计我也已经在第十篇文章中进行了说明.不过文章发布后很多人都说了这样的分层不是很合理,什么数据库实体应该 ...

  8. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)

    不多说,直接上干货! 前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...

  9. Mac 配置教程-开发篇

    将 Mac 日常使用的软件和开发软件区分开,将之前写的 Mac 配置的文章分成了两篇: Mac 配置教程-日常篇 Mac 配置教程-开发篇 图床 iPic 设置快捷键 Command+Shift+u ...

随机推荐

  1. 连接AWS Ubuntu服务器

    1.在AWS上创建了Ubuntu实例后,在实例里点连接.点使用PuTTY连接,下载PuTTY软件. 2.在所有程序里找到PuTTYgen并打开,点Load选择创建实例时的pem文件,点save pri ...

  2. jQuery 中bind(),live(),delegate(),on() 区别

    on()来改写通过 .bind(), .live(), .delegate()所注册的事件 /* The jQuery .bind(), .live(), and .delegate() method ...

  3. 转:Eclipse+webservice开发实例

    原文地址:http://blog.csdn.net/xw13106209/article/details/7049614 1.参考文献: 1.利用Java编写简单的WebService实例  http ...

  4. [UI] Article intro effects

    Article intro effects http://freebiesbug.com/code-stuff/article-intro-effects/

  5. Python学习---Form拾遗180322

    Form操作之错误信息操作 1. 用户发送请求过来 2. for 循环对字段进行正则表达式的验证  fields.clean(value) 3. 自定义clean_字段() 进行名字段值正确性的校验 ...

  6. ELK搭建实时日志分析平台之二Logstash和Kibana搭建

    本文书接前回<ELK搭建实时日志分析平台之一ElasticSearch> 文:铁乐与猫 四.安装Logstash logstash是一个数据分析软件,主要目的是分析log日志. 1)下载和 ...

  7. 一、初识MySQL数据库 二、搭建MySQL数据库(重点) 三、使用MySQL数据库 四、认识MySQL数据库的数据类型 五、操作MySQL数据库的数据(重点)

    一.初识MySQL数据库 ###<1>数据库概述     1. 数据库         长期存储在计算机内的,由组织的可共享的数据集合         存储数据的仓库         文件 ...

  8. Stacks And Queues

    栈和队列 大型填坑现场,第一部分的还没写,以上. 栈和队列是很基础的数据结构,前者后进先出,后者先进先出,如下图: 下面开始将客户端和具体实现分开,这样有两个好处:一是客户端不知道实现的细节,但同时也 ...

  9. struts返回json数据

    想要在struts中返回json格式数据有两种办法. 1.使用servlet的输出流 实际上就是在struts中获取response对象的输出流.然后写入你要返回的json数据,本质和用servlet ...

  10. cocos2d-x发生undefined reference to `XX'异常 一劳永逸解决的方法

    转自:http://www.myexception.cn/operating-system/1620542.html cocos2d-x发生undefined reference to `XX'错误 ...