MsXml创建和解析XML示例
来源:互联网 发布:林俊杰baby知乎 编辑:程序博客网 时间:2024/06/09 13:40
一.MsXml创建XML文档示例
// XmlCreationDemo.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文档IXMLDOMProcessingInstructionPtr pProInstruction = NULL; // xml声明IXMLDOMCommentPtr pComment = NULL; // 注释IXMLDOMElementPtr pRootElement = NULL, pElement = NULL; // 根节点(元素)IXMLDOMNodePtr pNode = NULL, pNode1 = NULL, pNode2 = NULL; // 节点IXMLDOMAttributePtr pAttrNode = NULL; // 属性HRESULT hr = pDoc.CreateInstance(__uuidof(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((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((IXMLDOMNode*)pComment); // 注释pNode = pDoc->createNode((_variant_t)(long)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((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((IXMLDOMNode*)pComment); // 注释pNode = pDoc->createNode((_variant_t)(long)NODE_ELEMENT, (_bstr_t)(char*)"Municipality", (_bstr_t)(char*)"");pRootElement->appendChild(pNode); // 节点// (6)创建节点<China><Municipality><TianJin>pNode1 = pDoc->createNode((_variant_t)(long)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((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((IXMLDOMNode*)pElement); // 节点pNode->appendChild(pNode1);// (7)创建节点<China><Municipality><BeiJing>并插入<TianJin>前pNode2 = pDoc->createNode((_variant_t)(long)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((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((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->childNodeslChilds = pNodeList->Getlength(); // pNodeList->lengthfor (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换成pRootElementwhile (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示例
- MsXml创建和解析XML示例
- MsXml创建和解析XML示例
- MsXml创建和解析XML示例
- MsXml创建和解析XML示例
- msxml解析xml示例
- VC++和MSXML解析XML文档
- VC++ MSXML创建XML文件以及对XML文档解析
- MSXML 解析 XML(收藏)
- MSXML 解析 XML
- MSXML 解析 XML
- 用MSXML解析XML
- MSXML 解析 XML
- msxml 解析xml
- MSXML 解析XML文件
- 利用msxml创建xml
- 利用MSXML解析XML文本
- 利用MSXML解析xml文件
- First Unique Character in a String
- java MongoDB 字符串日期类型查询和日期类型查询
- iOS中的.pch文件
- iOS中info.plist文件的一些相关配置
- 【已解决】github中git push origin master出错:error: failed to push some refs to
- MsXml创建和解析XML示例
- com.sun.istack.SAXException2: 在对象图中检测到循环。这将产生无限深的 XML
- Java还要再学一遍基础(八)Vector与ArrayList
- JavaWeb
- 搜索引擎solr和elasticsearch
- 前端入行标准
- 在Windows 10下搭建Ubuntu Linux+GCC开发平台
- 20170602Windows09_进程
- Postman用法简介