一.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->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>