使用MSXML读写XML文件

本文介绍了一个使用MSXML库创建和解析XML文件的C++示例程序。该程序展示了如何通过MSXML DOM对象创建包含多种节点类型的XML文档,并进行查询操作。具体包括创建XML文档、设置属性和文本节点、插入注释和CDATA段等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用MSXML读写XML文件

 

源代码:

 

  1. #include <iostream>
  2. #include <string>
  3. #include <cassert>
  4. #include <tchar.h>
  5. using namespace std;
  6. #import <msxml4.dll>
  7. using namespace MSXML2;
  8. BOOL CreateXmlFile(LPCTSTR lpszPath);
  9. BOOL QueryXmlFile(LPCTSTR lpszPath);
  10. const TCHAR szFile[] = _T("./smp.xml");
  11. int main()
  12. {
  13.     //初始化COM库
  14.     ::CoInitialize(NULL);
  15.     if (!CreateXmlFile(szFile))
  16.     {
  17.         cout << "create xml file failed..." << endl;
  18.         return 0;
  19.     }
  20.     MSXML2::IXMLDOMDocument2Ptr pDoc = NULL;
  21.     HRESULT hr = NULL;
  22.     hr = pDoc.CreateInstance(__uuidof(DOMDocument40));
  23.     if (FAILED(hr))
  24.     {
  25.         cout << "failed to instantiate DOMDocument40 class" << endl;
  26.         return 0;
  27.     }
  28.     if (VARIANT_TRUE != pDoc->load(szFile))
  29.     {
  30.         cout << "failed load xml data from file: " << static_cast<char*>(pDoc->parseError->Getreason()) << endl;
  31.         
  32.         return 0;
  33.     }
  34.     cout << static_cast<char*>(pDoc->xml) << endl;
  35.     
  36.     pDoc.Release();
  37.     cout << "---------------------------------------------" << endl;
  38.     cout <<  "start query..." << endl;
  39.     QueryXmlFile(szFile);
  40.     //反初始化COM库
  41.     ::CoUninitialize();
  42.     return 1;
  43. }
  44. ///////////////////////////////////////////////////////////////
  45. // 创建Xml样例文件
  46. // lpszPath: xml文件的保存路径
  47. // return: 创建成功返回TRUE,否则返回FALSE
  48. ///////////////////////////////////////////////////////////////
  49. BOOL CreateXmlFile(LPCTSTR lpszPath)
  50. {
  51.     BOOL bRet = FALSE;
  52.     HRESULT hr = S_FALSE;
  53.     MSXML2::IXMLDOMDocument2Ptr pDoc = NULL;
  54.     MSXML2::IXMLDOMElementPtr pParent = NULL;
  55.     MSXML2::IXMLDOMElementPtr pChild = NULL;
  56.     MSXML2::IXMLDOMProcessingInstructionPtr pPi;
  57.     do
  58.     {
  59.         hr = pDoc.CreateInstance(__uuidof(DOMDocument40));
  60.         if (FAILED(hr))
  61.         {
  62.             break;
  63.         }
  64.         pDoc->preserveWhiteSpace = VARIANT_TRUE;// 提供对white space node的支持
  65.         //创建文件头
  66.         pPi = pDoc->createProcessingInstruction("xml""version=/"1.0/" encoding=/"utf-8/"");
  67.         
  68.         if (NULL == pPi)
  69.         {
  70.             break;
  71.         }
  72.         pDoc->appendChild(pPi);
  73.         //创建注释
  74.         MSXML2::IXMLDOMCommentPtr pComt = NULL;
  75.         pComt = pDoc->createComment("Sample xml file create using xml dom object");
  76.         if (NULL == pComt)
  77.         {
  78.             break;
  79.         }
  80.         pDoc->appendChild(pComt);
  81.         //header
  82.         pParent = pDoc->createElement("request");
  83.         pDoc->appendChild(pParent);
  84.         pParent->appendChild(pDoc->createTextNode("/n/t"));
  85.         pChild = pDoc->createElement("username");
  86.         pChild->text = "andylin";
  87.         pParent->appendChild(pChild);
  88.         pParent->appendChild(pDoc->createTextNode("/n/t/t"));
  89.         pChild = pDoc->createElement("password");
  90.         pChild->text = "pwd";
  91.         pParent->appendChild(pChild);
  92.         pParent->appendChild(pDoc->createTextNode("/n/t/t"));
  93.         
  94.     //  pParent = pDoc->documentElement;
  95.         pParent->appendChild(pDoc->createTextNode("/n/n/t"));
  96.         //commands
  97.         pChild = pDoc->createElement("cmdlines");
  98.         
  99.         MSXML2::IXMLDOMAttributePtr pAttr = NULL;
  100.         pAttr = pDoc->createAttribute("count");
  101.         pAttr->value = "2";
  102.         pChild->setAttributeNode(pAttr);
  103.         pAttr = pDoc->createAttribute("reply");
  104.         pAttr->text = "no";
  105.         pChild->setAttributeNode(pAttr);
  106.         pChild->setAttribute("immediate""yes");
  107.         pAttr.Release();
  108.         pParent->appendChild(pChild);
  109.         pParent = pChild;
  110.         //one group command
  111.         pParent->appendChild(pDoc->createTextNode("/n/t/t"));
  112.         pChild = pDoc->createElement("cmd");
  113.         pChild->setAttribute("num""1");
  114.         pParent->appendChild(pChild);
  115.         pParent = pChild;
  116.         pParent->appendChild(pDoc->createTextNode("/n/t/t/t"));
  117.         pChild = pDoc->createElement("type");
  118.         pChild->text = "backup";
  119.         pParent->appendChild(pChild);
  120.         pParent->appendChild(pDoc->createTextNode("/n/t/t/t"));
  121.         pChild = pDoc->createElement("dbname");
  122.         pChild->text = "db14663";
  123.         pParent->appendChild(pChild);
  124.         pParent->appendChild(pDoc->createTextNode("/n/t/t"));
  125.         pParent = pParent->parentNode;
  126.         //another group command
  127.         pParent->appendChild(pDoc->createTextNode("/n/t/t"));
  128.         pChild = pDoc->createElement("cmd");
  129.         pChild->setAttribute("num""2");
  130.         pParent->appendChild(pChild);
  131.         pParent = pChild;
  132.         pParent->appendChild(pDoc->createTextNode("/n/t/t/t"));
  133.         pChild = pDoc->createElement("type");
  134.         pChild->text = "save";
  135.         pParent->appendChild(pChild);
  136.         pParent->appendChild(pDoc->createTextNode("/n/t/t/t"));
  137.         pChild = pDoc->createElement("data");
  138.         //craet cdata
  139.         MSXML2::IXMLDOMCDATASectionPtr pSec = NULL;
  140.         pSec = pDoc->createCDATASection("这里是XML文档的CDATA数据段...");
  141.         pChild->appendChild(pSec);
  142.         pSec.Release();
  143.         pParent->appendChild(pChild);
  144.         pParent->appendChild(pDoc->createTextNode("/n/t/t"));
  145.         pParent = pParent->parentNode;
  146.         pParent->appendChild(pDoc->createTextNode("/n/t"));
  147.         pParent = pParent->parentNode;
  148.         pParent->appendChild(pDoc->createTextNode("/n"));
  149.         pDoc->save(lpszPath);
  150.     } while (0);
  151.     if (pDoc)
  152.     {
  153.         pDoc.Release();
  154.         pDoc = NULL;
  155.     }
  156.     if (pParent)
  157.     {
  158.         pParent.Release();
  159.         pParent = NULL;
  160.     }
  161.     if (pChild)
  162.     {
  163.         pChild.Release();
  164.         pChild = NULL;
  165.     }
  166.     return TRUE;
  167. }
  168. ///////////////////////////////////////////////////////////////
  169. // 分析Xml样例文件
  170. // lpszPath: xml文件的路径
  171. // return: 分析成功返回TRUE,否则返回FALSE
  172. ///////////////////////////////////////////////////////////////
  173. BOOL QueryXmlFile(LPCTSTR lpszPath)
  174. {
  175.     BOOL bRet = FALSE;
  176.     HRESULT hr = S_FALSE;
  177.     MSXML2::IXMLDOMDocument2Ptr pDoc = NULL;
  178.     MSXML2::IXMLDOMNodePtr pNode = NULL;
  179.     do
  180.     {
  181.         hr = pDoc.CreateInstance(__uuidof(DOMDocument40));
  182.         if (FAILED(hr))
  183.         {
  184.             break;
  185.         }
  186.         pDoc->async = VARIANT_FALSE;
  187.         if (VARIANT_TRUE != pDoc->load(lpszPath))
  188.         {
  189.             break;
  190.         }
  191.         pNode = pDoc->selectSingleNode("/request/username");
  192.         cout << "user name = " << static_cast<char*>(pNode->text) << endl;
  193.         pNode = pDoc->selectSingleNode("/request/password");
  194.         cout << "password = " << static_cast<char*>(pNode->text) << endl;
  195.         pNode = pDoc->selectSingleNode("/request/cmdlines");
  196.         
  197.         MSXML2::IXMLDOMNamedNodeMapPtr pmapName = NULL;
  198.         pmapName = pNode->attributes;
  199.         pNode = pmapName->getNamedItem("count");
  200.         cout << "count = " << static_cast<char*>(pNode->text) << endl;
  201.         pNode = pmapName->getNamedItem("reply");
  202.         cout << "reply = " << static_cast<char*>(pNode->text) << endl;
  203.         pNode = pmapName->getNamedItem("immediate");
  204.         cout << "immediate = " << static_cast<char*>(pNode->text) << endl;
  205.         MSXML2::IXMLDOMNodeListPtr plsNode = NULL;
  206.         plsNode = pDoc->selectNodes("/request/cmdlines/cmd");
  207.         assert(2 == plsNode->length);
  208.         cout << "cmd group 1: " << endl;
  209.         
  210.         pNode = plsNode->item[0]->selectSingleNode("type");
  211.         cout << "type = " << static_cast<char*>(pNode->text) << endl;
  212.         
  213.         pNode = plsNode->item[0]->selectSingleNode("dbname");
  214.         cout << "dbname = " << static_cast<char*>(pNode->text) << endl;
  215.         cout << "cmd group 2: " << endl;
  216.         
  217.         pNode = plsNode->item[1]->selectSingleNode("type");
  218.         cout << "type = " << static_cast<char*>(pNode->text) << endl;
  219.         pNode = plsNode->item[1]->selectSingleNode("data");
  220.         cout << "data = " << static_cast<char*>(pNode->text) << endl;
  221.     } while (0);
  222.     if (pDoc)
  223.     {
  224.         pDoc.Release();
  225.         pDoc = NULL;
  226.     }
  227.     if (pNode)
  228.     {
  229.         pNode.Release();
  230.         pNode = NULL;
  231.     }
  232.     return TRUE;
  233. }

生成的XML文件:

  <?xml version="1.0" encoding="utf-8" ?>
<!--
Sample xml file create using xml dom object
  -->
- <request>
  <username>andylin</username>
  <password>pwd</password>
- <cmdlines count="2" reply="no" immediate="yes">
- <cmd num="1">
  <type>backup</type>
  <dbname>db14663</dbname>
  </cmd>
- <cmd num="2">
  <type>save</type>
- <data>
<![CDATA[
这里是XML文档的CDATA数据段...
  ]]>
  </data>
  </cmd>
  </cmdlines>
  </request>

运行结果:

<?xml version="1.0"?>
<!--Sample xml file create using xml dom object-->
<request>
        <username>andylin</username>
        <password>pwd</password>
        <cmdlines count="2" reply="no" immediate="yes">
                <cmd num="1">
                        <type>backup</type>
                        <dbname>db14663</dbname>
                </cmd>
                <cmd num="2">
                        <type>save</type>
                        <data><![CDATA[这里是XML文档的CDATA数据段...]]></data>
                </cmd>
        </cmdlines>
</request>

---------------------------------------------
start query...
user name = andylin
password = pwd
count = 2
reply = no
immediate = yes
cmd group 1:
type = backup
dbname = db14663
cmd group 2:
type = save
data = 这里是XML文档的CDATA数据段...
Press any key to continue

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值