文章类型: VC&C++
关键词: VC++,MSXML创建XML文件以及对XML文档解析
内容摘要: VC++ MSXML创建XML文件以及对XML文档解析

VC++ MSXML创建XML文件以及对XML文档解析

2016/8/23 9:41:44    来源:apple    阅读:

转自http://www.newxing.com/Tech/Program/Cpp/703.html


// 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>

↑ 上一篇文章:MFC中的MainFrame Dlg,App,Doc,View的关系 关键词:MFC中的MainFrame,Dlg,App,Doc,V.. 发布日期:2016/8/23 9:39:28
↓ 下一篇文章:VC环境下DLL接口申明的三种方式 关键词:VC环境下DLL接口申明的三种方式 发布日期:2016/8/23 13:33:07
相关文章:
VC++中将CString转换成const char*的一种有效方法 关键词:VC++,CString,转换,const,char 发布日期:2016-09-23 15:26
vc++ C函数atoi和itoa的用法总结 关键词:vc++,C函数,atoi,itoa,用法,总结,integer,string,signal,语言 发布日期:2017-09-26 17:32
VC++中delete和delete[] 的区别 关键词:VC++,delete,delete【】,区别 发布日期:2017-08-30 14:56
相关目录:.NETVC&C++软件开发
我要评论
正在加载评论信息......