一.MsXml创建XML文档示例

// XmlCreationDemo.cpp

#include <stdlib.h>
#include <stdio.h> // 引入MSXML解析器
#import <msxml4.dll>
using namespace MSXML2; class InitializeCom
{
public:
InitializeCom() { CoInitialize(NULL); }
~InitializeCom() { CoUninitialize(); }
}InitCom; int main()
{
char *szXmlFile = "D://china.xml"; // xml文件
MSXML2::IXMLDOMDocumentPtr pDoc = NULL; // xml文档
MSXML2::IXMLDOMProcessingInstructionPtr pProInstruction = NULL; // xml声明
MSXML2::IXMLDOMCommentPtr pComment = NULL; // 注释
MSXML2::IXMLDOMElementPtr pRootElement = NULL, pElement = NULL; // 根节点(元素)
MSXML2::IXMLDOMNodePtr pNode = NULL, pNode1 = NULL, pNode2 = NULL; // 节点
MSXML2::IXMLDOMAttributePtr pAttrNode = NULL; // 属性 HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); //
if (FAILED(hr))
{
printf("无法创建DOMDocument40对象,请检查是否安装并初始化了MsXml Parser库!");
return EXIT_FAILURE;
} // (1)创建xml文档声明(或insertBefore根节点)
pProInstruction = pDoc->createProcessingInstruction((_bstr_t)(char*)"xml", (_bstr_t)(char*)"version=\"1.0\" encoding=\"utf-8\"");
pDoc->appendChild((MSXML2::IXMLDOMNode*)pProInstruction); // (2)创建根节点<China>
pRootElement = pDoc->createElement((_bstr_t)(char*)"China");
pDoc->PutRefdocumentElement(pRootElement); // pXMLDomDoc->documentElement = pRootElement; // (3)创建节点<China><Continent>
pComment = pDoc->createComment((_bstr_t)(char*)"所在的洲");
pRootElement->appendChild((MSXML2::IXMLDOMNode*)pComment); // 注释 pNode = pDoc->createNode((_variant_t)(long)MSXML2::NODE_ELEMENT, (_bstr_t)(char*)"Continent", (_bstr_t)(char*)"");
pNode->Puttext((_bstr_t)(char*)"Asia"); // pNode->text = "Asia";
pRootElement->appendChild(pNode); // 节点 // (4)创建节点<China><Population>
pComment = pDoc->createComment((_bstr_t)(char*)"人口数量");
pRootElement->appendChild((MSXML2::IXMLDOMNode*)pComment); // 注释 pElement = pDoc->createElement((_bstr_t)(char*)"Population");
pAttrNode = pDoc->createAttribute((_bstr_t)(char*)"Units");
pAttrNode->Puttext((_bstr_t)(char*)"Million Person");
pElement->setAttributeNode(pAttrNode); // 统计单位
pElement->setAttribute((_bstr_t)(char*)"StatisticalYear", (_variant_t)(char*)"2000"); // 统计年份
pElement->Puttext((_bstr_t)(char*)"1,296");
pRootElement->appendChild(pElement); // 节点 // (5)创建节点<China><Municipality>
pComment = pDoc->createComment((_bstr_t)(char*)"四个直辖市");
pRootElement->appendChild((MSXML2::IXMLDOMNode*)pComment); // 注释 pNode = pDoc->createNode((_variant_t)(long)MSXML2::NODE_ELEMENT, (_bstr_t)(char*)"Municipality", (_bstr_t)(char*)"");
pRootElement->appendChild(pNode); // 节点 // (6)创建节点<China><Municipality><TianJin>
pNode1 = pDoc->createNode((_variant_t)(long)MSXML2::NODE_ELEMENT, (_bstr_t)(char*)"TianJin", (_bstr_t)(char*)""); // 创建节点<China><Municipality><TianJin><Area>
pElement = pDoc->createElement((_bstr_t)(char*)"Area");
pElement->setAttribute((_bstr_t)(char*)"Units", (_variant_t)(char*)"Thousand Square kilometers"); // 统计单位
pElement->Puttext((_bstr_t)(char*)"12");
pNode1->appendChild((MSXML2::IXMLDOMNode*)pElement); // 节点 // 创建节点<China><Municipality><TianJin><Population>
pElement = pDoc->createElement((_bstr_t)(char*)"Population");
pElement->setAttribute((_bstr_t)(char*)"Units", (_variant_t)(char*)"Million Person"); // 统计单位
pElement->setAttribute((_bstr_t)(char*)"StatisticalYear", (_variant_t)(char*)"2000"); // 统计年份
pElement->Puttext((_bstr_t)(char*)"10.01");
pNode1->appendChild((MSXML2::IXMLDOMNode*)pElement); // 节点 pNode->appendChild(pNode1);
// (7)创建节点<China><Municipality><BeiJing>并插入<TianJin>前
pNode2 = pDoc->createNode((_variant_t)(long)MSXML2::NODE_ELEMENT, (_bstr_t)(char*)"BeiJing", (_bstr_t)(char*)""); // 创建节点<China><Municipality><BeiJing><Area>
pElement = pDoc->createElement((_bstr_t)(char*)"Area");
pElement->setAttribute((_bstr_t)(char*)"Units", (_variant_t)(char*)"Thousand Square kilometers"); // 统计单位
pElement->Puttext((_bstr_t)(char*)"17");
pNode2->appendChild((MSXML2::IXMLDOMNode*)pElement); // 节点 // 创建节点<China><Municipality><BeiJing><Population>
pElement = pDoc->createElement((_bstr_t)(char*)"Population");
pElement->setAttribute((_bstr_t)(char*)"Units", (_variant_t)(char*)"Million Person"); // 统计单位
pElement->setAttribute((_bstr_t)(char*)"StatisticalYear", (_variant_t)(char*)"2000"); // 统计年份
pElement->Puttext((_bstr_t)(char*)"13.82");
pNode2->appendChild((MSXML2::IXMLDOMNode*)pElement); // 节点 pNode->insertBefore(pNode2, (_variant_t)(IDispatch*)pNode1);
//
// (8)创建节点<China><Municipality><ShangHai>
// (9)创建节点<China><Municipality><ChongQing> pDoc->save((_variant_t)szXmlFile); return EXIT_SUCCESS;
}

生成的china.xml文档内容:

<?xml version="1.0" encoding="utf-8"?>
<China>
<!--所在的洲-->
<Continent>Asia</Continent>
<!--人口数量-->
<Population Units="Million Person" StatisticalYear="2000">1,296</Population>
<!--四个直辖市-->
<Municipality>
<BeiJing>
<Area Units="Thousand Square kilometers">17</Area>
<Population Units="Million Person" StatisticalYear="2000">13.82</Population>
</BeiJing>
<TianJin>
<Area Units="Thousand Square kilometers">12</Area>
<Population Units="Million Person" StatisticalYear="2000">10.01</Population>
</TianJin>
<ShangHai>
<Area Units="Thousand Square kilometers">6.4</Area>
<Population Units="Million Person" StatisticalYear="2000">16.74</Population>
</ShangHai>
<ChongQing>
<Area Units="Thousand Square kilometers">84</Area>
<Population Units="Million Person" StatisticalYear="2000">30.90</Population>
</ChongQing>
</Municipality>
</China>

二.MsXml解析XML文档示例

// XmlParsingDemo.cpp

#include <stdlib.h>
#include <stdio.h> // 引入MSXML解析器
#import <msxml4.dll>
using namespace MSXML2; class InitializeCom
{
public:
InitializeCom() { CoInitialize(NULL); // Initializes the COM library }
~InitializeCom() { CoUninitialize(); // Closes the COM library }
}InitCom; int main()
{
char *szXmlFile = "D://china.xml"; //上篇创建的xml文档
IXMLDOMDocumentPtr pDoc = NULL; // xml文档
IXMLDOMNodeListPtr pNodeList = NULL; // 节点链表
IXMLDOMElementPtr pRootElement = NULL, pElement = NULL; // 根节点(元素)
IXMLDOMNodePtr pNode = NULL, pNode1 = NULL; // 节点
IXMLDOMNamedNodeMapPtr pAttrList = NULL; // 属性链表
IXMLDOMAttributePtr pAttrNode = NULL; // 属性
long lChilds, lAttr, i; HRESULT hr = pDoc.CreateInstance(__uuidof(DOMDocument40));
if (FAILED(hr))
{
printf("无法创建DOMDocument40对象,请检查是否安装并初始化了MsXml Parser库!");
return EXIT_FAILURE;
} VARIANT_BOOL bXmlLoad = pDoc->load((_variant_t)szXmlFile);
if (!bXmlLoad) // 加载失败
{
printf("加载%s失败!/n", szXmlFile);
return EXIT_FAILURE;
} // (1)根节点
pRootElement = pDoc->GetdocumentElement();
printf("root = %s/n", (char*)pRootElement->GetnodeName()); // pRootElement->nodeName // (2)根节点的一级子节点
pNodeList = pRootElement->GetchildNodes(); // pRootElement->childNodes
lChilds = pNodeList->Getlength(); // pNodeList->length
for (i = 0; i < lChilds; i++)
{
pNode = pNodeList->Getitem(i); // pNodeList->item[i]
if (pNode->GetnodeType() != NODE_COMMENT) // 过滤注释节点
{
printf("child[%d] of [%s]: [%s]/n", i ,(char*)pRootElement->GetnodeName(), (char*)pNode->GetnodeName());
}
} // (3)统计文档中所有的<Population>节点
pNodeList = pDoc->getElementsByTagName((_bstr_t)(char*)"Population");
lChilds = pNodeList->Getlength();
printf("文档中[Population]共有%d个/n", lChilds); // (4)根节点下的<Population>节点
pNode = pRootElement->selectSingleNode((_bstr_t)(char*)"Population");
// 已知根节点为<China>时:pNode = pDoc->selectSingleNode((_bstr_t)(char*)"China//Population");
printf("根节点下的[Population]子节点值为%s/n", (char*)pNode->Gettext());
pAttrList = pNode->Getattributes();
lAttr = pAttrList->Getlength();
for (i = 0; i < lAttr; i++)
{
pAttrNode = pAttrList->Getitem(i);
printf("Attr[%d] of [%s]: %s = %s/n", i, (char*)pNode->GetnodeName(), (char*)pAttrNode->GetnodeName(), (char*)pAttrNode->Gettext());
} // (5)查找节点<Municipality>下的所有子节点
// "//"表示在任意一层寻找Municipality;"//*"查找<Municipality></Municipality>中的所有子节点
pNodeList = pDoc->selectNodes((_bstr_t)(char*)"//Municipality//*"); // 这里可将pDoc换成pRootElement
while (pNode = pNodeList->nextNode())
{
printf("childs of [Municipality]: %s/n", (char*)pNode->GetnodeName());
} // (6)查找节点<Municipality>下的一级子节点
pNode = pRootElement->selectSingleNode((_bstr_t)(char*)"Municipality");
pNodeList = pNode->GetchildNodes();
lChilds = pNodeList->Getlength();
for (i = 0; i < lChilds; i++)
{
pNode1 = pNodeList->Getitem(i); // pNodeList->item[i]
printf("child[%d] of [Municipality]: %s/n", i, (char*)pNode1->GetnodeName());
} // (7)查询父、子、兄、弟节点
pNode = pRootElement->selectSingleNode((_bstr_t)(char*)"//TianJin");
pNode1 = pNode->GetparentNode(); // 父节点
printf("[TianJin]的父节点为[%s]/n", (char*)pNode1->GetnodeName()); pNodeList = pNode->GetchildNodes(); // 子节点
lChilds = pNodeList->Getlength();
for (i = 0; i < lChilds; i++)
{
pNode1 = pNodeList->nextNode();
printf("child[%d] of [TianJin]: %s/n", i, (char*)pNode1->GetnodeName());
} pNode1 = pNode->GetpreviousSibling(); // 兄节点
printf("[TianJin]的兄节点为[%s]/n", (char*)pNode1->GetnodeName()); pNode1 = pNode->GetnextSibling(); // 弟节点
printf("[TianJin]的弟节点为[%s]/n", (char*)pNode1->GetnodeName()); return EXIT_SUCCESS;
}

运行结果如下:

root = China

child[1] of <China>: <Continent>

child[3] of <China>: <Population>

child[5] of <China>: <Municipality>

文档中<Population>共有5个

根节点下的<Population>子节点值为1,296

Attr[0] of <Population>: Units = Million Person

Attr[1] of <Population>: StatisticalYear = 2000

childs of <Municipality>: BeiJing

childs of <Municipality>: Area

childs of <Municipality>: Population

childs of <Municipality>: TianJin

childs of <Municipality>: Area

childs of <Municipality>: Population

childs of <Municipality>: ShangHai

childs of <Municipality>: Area

childs of <Municipality>: Population

childs of <Municipality>: ChongQing

childs of <Municipality>: Area

childs of <Municipality>: Population

child[0] of <Municipality>: BeiJing

child[1] of <Municipality>: TianJin

child[2] of <Municipality>: ShangHai

child[3] of <Municipality>: ChongQing

<TianJin>的父节点为<Municipality>

child[0] of <TianJin>: Area

child[1] of <TianJin>: Population

<TianJin>的兄节点为<BeiJing>

<TianJin>的弟节点为<ShangHai>

MsXml创建和解析XML示例的更多相关文章

  1. (转)Android 创建与解析XML—— Dom4j方式 .

    转:http://blog.csdn.net/ithomer/article/details/7521605 1.Dom4j概述 dom4j is an easy to use, open sourc ...

  2. 使用dom4j创建和解析xml文件

    使用dom4j创建和解析xml文件 在项目开发中,我们经常会遇到xml文件的创建和解析从别人接口得到的xml文件,而我们最常使用的组件是dom4j. 下面我就以代码来讲解一下如何使用dom4j来创建x ...

  3. 使用dom4j创建和解析xml

    之前工作中用到了,相信写java的都会碰到xml,这里写了两个方法,创建和解析xml,废话不多说,直接上代码 package xml; import java.io.File; import java ...

  4. dom4j创建和解析xml文档

    DOM4J解析  特征: 1.JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能. 2.它使用接口和抽象基本类方法. 3.具有性能优异.灵活性好.功能强大和极端易用的特点. 4.是一个开 ...

  5. Java 创建过滤器 解析xml文件

    今天写了一个过滤器demo,现在是解析actions.xml文件,得到action中的业务规则:不需要导入任何jar包 ActionFilter过滤器类: package accp.com.xh.ut ...

  6. GDataXMLNode创建和解析XML

    GDataXMLNode创建xml: #import <Foundation/Foundation.h> 2 #import "GDataXMLNode.h" 3 4 ...

  7. iOS 用GDataXMLNode创建和解析XML

    原文地址:http://blog.csdn.net/gf771115/article/details/7718403 NSError *error; //    NSString *path = [[ ...

  8. Android DOM解析XML示例程序

    DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的.DOM比较符合人的思维模式,但是其对内存的消耗比较大. activity_main.xml < ...

  9. PHP创建与解析 XML 1 (36)

    一.使用SimpleXML操控XML 要处理XML 文件,有两种传统的处理思路:SAX 和DOM.SAX 基于事件触发机制,对XML 文件进行一次扫描,完成要进行的处理:DOM 则将整个XML 文件构 ...

随机推荐

  1. 修改(table的section与上一个section的间距)section header背景颜色

    - (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView * ...

  2. 一个很奇怪的问题,程序没有改动加密参数应该也没有变化.但是两次的加密结果却不一致.md5加密问题

    从图上我们看出20160803的加密结果是AAEBA9C578EA522215EAE76AFCAF250.时间是9.4分 现在我们再看这个同样的加密地址与时间结果却是另一种 31672B16..... ...

  3. php绘图问题

    php绘图首先要确认gd库是否启用,到php.ini文件中,找到extension=php_gd2.dll将前面的:去掉,重新启动服务器. 如果在绘图中还是没有显示正常的图片,说明服务器在回复请求时, ...

  4. 初探NIOS II之hello_world

    平台背景: 操作系统:win7  64bit 开发板:DE2-115 Quartus ii:15.0及配套的NIOS ii开发平台 一.硬件系统的建立 1.在Quartus里新建工程,这是很基本的就不 ...

  5. mysql 查看数据库、表的基本命令

    1:show databases; 查看所有的数据库,等同于select schema_name from information_schema.schemata\G.\G 替换;,以纵向报表的形式输 ...

  6. C++类内存布局图(成员函数和成员变量分开讨论)

    一.成员函数 成员函数可以被看作是类作用域的全局函数,不在对象分配的空间里,只有虚函数才会在类对象里有一个指针,存放虚函数的地址等相关信息. 成员函数的地址,编译期就已确定,并静态绑定或动态的绑定在对 ...

  7. windows下无法创建django工程的问题

    环境:python2.7  django1.7 安装好django后,将C:\Python27\Lib\site-packages\Django-1.7.7-py2.7.egg\django\bin; ...

  8. cocos2dx 中使用的一些C++ 11 特性

    0.  placeholder 头文件:<functional> namespace: placeholder placeholder 就是一堆帮助bind占参数位置的东西,名字分别为 _ ...

  9. 一个android参考网站,工具+源码

    Android多渠道打包工具  https://github.com/wubo/apptools Android官方培训课程中文版(v0.9.4)  http://hukai.me/android-t ...

  10. 团队开发——冲刺2.g

    冲刺阶段二(第七天) 1.昨天做了什么? 编写软件计划书第三阶段:整理用户体验建议:据用户对界面的要求,把小球改头换面,借鉴超级马里奥叔叔的道具们. 2.今天准备做什么? 最后的美工,统一整合: 测试 ...