zoukankan      html  css  js  c++  java
  • VC++ MSXML创建XML文件以及对XML文档解析

    转自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>

  • 相关阅读:
    Representation Data in OpenCascade BRep
    Render OpenCascade Geometry Surfaces in OpenSceneGraph
    Render OpenCascade Geometry Curves in OpenSceneGraph
    OpenCascade Shape Representation in OpenSceneGraph
    Geometry Surface of OpenCascade BRep
    Geometry Curve of OpenCascade BRep
    Tyvj2017清北冬令营入学测试
    Spfa算法模板
    洛谷1016 旅行家的预算
    洛谷1290 欧几里得的游戏
  • 原文地址:https://www.cnblogs.com/areliang/p/2254334.html
Copyright © 2011-2022 走看看