原文: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

IXMLDOMAttribute,IXMLDOMComment,IXMLDOMDocument,IXMLDOMDocumentFragment,IXMLDOMElement,IXMLDOMNode,IXMLDOMText  : removeChild

示例代码:

MSXML2::IXMLDOMElementPtr pRootNode = pXmlDoc->documentElement;

pRootNode->removeAttribute("languge");

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

转载于:https://www.cnblogs.com/zhehan54/p/4827669.html

【转载】MSXML应用总结 开发篇(下)相关推荐

  1. MSXML应用总结 开发篇(下)

    三.查询XML文档节点 这部分属于"读"XML文档并做节点遍历,由于担心加上实例会占用过多的篇幅影响阅读,先在这篇做方法总结,以后有时间再写一篇"实战篇"专门写 ...

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

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

  3. [转载]中国工商银行软件开发部门职业发展

    没找到原文出处,这篇文章至少是2009年之前就有的,写的挺实在的.银行IT领域前辈的经验之谈自然要学习一下了. 以下是转载的文章: 软开开发篇 在我刚进软开的时候,我想,这有什么啊,泡着茶写点儿JAV ...

  4. Flutter开发之《新锐专家之路:混合开发篇》笔记(55)

    Flutter新锐专家之路:混合开发篇 作者:闲鱼技术-正物 本篇是此系列的第二篇,重点介绍如何让Flutter能够开发,实现业务需求.这部分包括:混合栈的管理,混合下的能力补齐和包管理. 混合栈的管 ...

  5. 转载:2016前端开发技术巡礼

    本文转自前端之巅,作者殷勇. 2016年马上过去了,像过去六年中的每一年一样,Web前端领域又产生了"面目全非"而又"耳目一新"的变化,不但旧事物持续不断地被淘 ...

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

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

  7. 使用O2OA二次开发搭建企业办公平台(十三)流程开发篇:报销审批流程表单开发...

    本博客为O2OA系列教程.O2OA使用手册,教程目录和各章节天梯将在连载完后更新. 使用O2OA二次开发搭建企业办公平台(一)平台部署篇:平台下载和部署 使用O2OA二次开发搭建企业办公平台(二)平台 ...

  8. [转载]微信公众号开发 [01] 入门基本流程

    1.公众号的类别和注册 1.1 公众号类别 微信公众号目前有三种,订阅号.服务号.企业号,另外还有一种后来推出的和公众号带点关系的小程序.  订阅号.服务号和企业号的功能区别如下(更多详细区别戳参考链 ...

  9. 亚马逊电商数据自动化管理接口平台JAVA SP-API接口开发(下)

    亚马逊电商数据自动化管理接口平台JAVA SP-API接口开发(下) 重要说明 本文章为亚马逊系列其中的一篇,具体详见 主页 中亚马逊分类 该系列项目均为[CSDN轻夏]原创,未经允许禁止转载 如有疑 ...

最新文章

  1. php网页悬浮对联代码,不用js多浏览器兼容纯DIV/CSS对联漂浮广告代码
  2. boost::hana::remove_at用法的测试程序
  3. android 之 Hnadler 、Message 、Looper
  4. Hash MD5 CRC 知识
  5. OpenResty请求参数处理
  6. 达摩院送你100万,请坚持“看月亮”
  7. 终于弄懂KMP算法了
  8. C#.NET 通用权限管理系统中的数据集权限设置实现参考界面(商业化成熟权限管理系统,提供全部源码)...
  9. Egret入门学习日记 --- 问题汇总
  10. 跨域小结(为什么form表单提交没有跨域问题,但ajax提交有跨域问题)
  11. 拿到offer怕查学历不敢去_《令人心动的offer》— 我们法庭见
  12. MFC使用SQLite 学习系列 一: SQLITE_MISUSE错误
  13. opencascade基础
  14. java环境classpath_JAVA中的环境变量配置 PATH CLASSPATH
  15. 2022年最新谷歌翻译chrome 浏览器翻译解决方案
  16. GD兆易GD32系列MCU替换ST芯片对照表
  17. Chrome源码剖析
  18. 金蝶K3开发-委外入库批量核销和反核销
  19. pycharm删除文件后怎样找回
  20. 机器学习 :训练集、验证集、测试集分配比例

热门文章

  1. 初学api测试_面向初学者的API-在此免费视频课程中学习如何使用API
  2. 矢量数编码有哪几种类型_6种最理想的编码工作(以及吸引每个人的类型)
  3. java开发培训好学习吗?难度大不大?
  4. 学Python的好处有哪些?
  5. 【数据排序】车厢重组
  6. [转] Android开发之如何保证Service不被杀掉(broadcast+system/app)
  7. 开源交换需新框架 技术团队也待整合
  8. Sharepoint学习笔记—ECMAScript对象模型系列-- 8、组与用户操作(一)
  9. ecshop 商品颜色尺寸仿淘宝选择功能教程(2.7.0版本)
  10. 关闭vmware喇叭报警声