使用MSXML读写XML文件
源代码:
- #include <iostream>
- #include <string>
- #include <cassert>
- #include <tchar.h>
- using namespace std;
- #import <msxml4.dll>
- using namespace MSXML2;
- BOOL CreateXmlFile(LPCTSTR lpszPath);
- BOOL QueryXmlFile(LPCTSTR lpszPath);
- const TCHAR szFile[] = _T("./smp.xml");
- int main()
- {
- //初始化COM库
- ::CoInitialize(NULL);
- if (!CreateXmlFile(szFile))
- {
- cout << "create xml file failed..." << endl;
- return 0;
- }
- MSXML2::IXMLDOMDocument2Ptr pDoc = NULL;
- HRESULT hr = NULL;
- hr = pDoc.CreateInstance(__uuidof(DOMDocument40));
- if (FAILED(hr))
- {
- cout << "failed to instantiate DOMDocument40 class" << endl;
- return 0;
- }
- if (VARIANT_TRUE != pDoc->load(szFile))
- {
- cout << "failed load xml data from file: " << static_cast<char*>(pDoc->parseError->Getreason()) << endl;
- return 0;
- }
- cout << static_cast<char*>(pDoc->xml) << endl;
- pDoc.Release();
- cout << "---------------------------------------------" << endl;
- cout << "start query..." << endl;
- QueryXmlFile(szFile);
- //反初始化COM库
- ::CoUninitialize();
- return 1;
- }
- ///////////////////////////////////////////////////////////////
- // 创建Xml样例文件
- // lpszPath: xml文件的保存路径
- // return: 创建成功返回TRUE,否则返回FALSE
- ///////////////////////////////////////////////////////////////
- BOOL CreateXmlFile(LPCTSTR lpszPath)
- {
- BOOL bRet = FALSE;
- HRESULT hr = S_FALSE;
- MSXML2::IXMLDOMDocument2Ptr pDoc = NULL;
- MSXML2::IXMLDOMElementPtr pParent = NULL;
- MSXML2::IXMLDOMElementPtr pChild = NULL;
- MSXML2::IXMLDOMProcessingInstructionPtr pPi;
- do
- {
- hr = pDoc.CreateInstance(__uuidof(DOMDocument40));
- if (FAILED(hr))
- {
- break;
- }
- pDoc->preserveWhiteSpace = VARIANT_TRUE;// 提供对white space node的支持
- //创建文件头
- pPi = pDoc->createProcessingInstruction("xml", "version=/"1.0/" encoding=/"utf-8/"");
- if (NULL == pPi)
- {
- break;
- }
- pDoc->appendChild(pPi);
- //创建注释
- MSXML2::IXMLDOMCommentPtr pComt = NULL;
- pComt = pDoc->createComment("Sample xml file create using xml dom object");
- if (NULL == pComt)
- {
- break;
- }
- pDoc->appendChild(pComt);
- //header
- pParent = pDoc->createElement("request");
- pDoc->appendChild(pParent);
- pParent->appendChild(pDoc->createTextNode("/n/t"));
- pChild = pDoc->createElement("username");
- pChild->text = "andylin";
- pParent->appendChild(pChild);
- pParent->appendChild(pDoc->createTextNode("/n/t/t"));
- pChild = pDoc->createElement("password");
- pChild->text = "pwd";
- pParent->appendChild(pChild);
- pParent->appendChild(pDoc->createTextNode("/n/t/t"));
- // pParent = pDoc->documentElement;
- pParent->appendChild(pDoc->createTextNode("/n/n/t"));
- //commands
- pChild = pDoc->createElement("cmdlines");
- MSXML2::IXMLDOMAttributePtr pAttr = NULL;
- pAttr = pDoc->createAttribute("count");
- pAttr->value = "2";
- pChild->setAttributeNode(pAttr);
- pAttr = pDoc->createAttribute("reply");
- pAttr->text = "no";
- pChild->setAttributeNode(pAttr);
- pChild->setAttribute("immediate", "yes");
- pAttr.Release();
- pParent->appendChild(pChild);
- pParent = pChild;
- //one group command
- pParent->appendChild(pDoc->createTextNode("/n/t/t"));
- pChild = pDoc->createElement("cmd");
- pChild->setAttribute("num", "1");
- pParent->appendChild(pChild);
- pParent = pChild;
- pParent->appendChild(pDoc->createTextNode("/n/t/t/t"));
- pChild = pDoc->createElement("type");
- pChild->text = "backup";
- pParent->appendChild(pChild);
- pParent->appendChild(pDoc->createTextNode("/n/t/t/t"));
- pChild = pDoc->createElement("dbname");
- pChild->text = "db14663";
- pParent->appendChild(pChild);
- pParent->appendChild(pDoc->createTextNode("/n/t/t"));
- pParent = pParent->parentNode;
- //another group command
- pParent->appendChild(pDoc->createTextNode("/n/t/t"));
- pChild = pDoc->createElement("cmd");
- pChild->setAttribute("num", "2");
- pParent->appendChild(pChild);
- pParent = pChild;
- pParent->appendChild(pDoc->createTextNode("/n/t/t/t"));
- pChild = pDoc->createElement("type");
- pChild->text = "save";
- pParent->appendChild(pChild);
- pParent->appendChild(pDoc->createTextNode("/n/t/t/t"));
- pChild = pDoc->createElement("data");
- //craet cdata
- MSXML2::IXMLDOMCDATASectionPtr pSec = NULL;
- pSec = pDoc->createCDATASection("这里是XML文档的CDATA数据段...");
- pChild->appendChild(pSec);
- pSec.Release();
- pParent->appendChild(pChild);
- pParent->appendChild(pDoc->createTextNode("/n/t/t"));
- pParent = pParent->parentNode;
- pParent->appendChild(pDoc->createTextNode("/n/t"));
- pParent = pParent->parentNode;
- pParent->appendChild(pDoc->createTextNode("/n"));
- pDoc->save(lpszPath);
- } while (0);
- if (pDoc)
- {
- pDoc.Release();
- pDoc = NULL;
- }
- if (pParent)
- {
- pParent.Release();
- pParent = NULL;
- }
- if (pChild)
- {
- pChild.Release();
- pChild = NULL;
- }
- return TRUE;
- }
- ///////////////////////////////////////////////////////////////
- // 分析Xml样例文件
- // lpszPath: xml文件的路径
- // return: 分析成功返回TRUE,否则返回FALSE
- ///////////////////////////////////////////////////////////////
- BOOL QueryXmlFile(LPCTSTR lpszPath)
- {
- BOOL bRet = FALSE;
- HRESULT hr = S_FALSE;
- MSXML2::IXMLDOMDocument2Ptr pDoc = NULL;
- MSXML2::IXMLDOMNodePtr pNode = NULL;
- do
- {
- hr = pDoc.CreateInstance(__uuidof(DOMDocument40));
- if (FAILED(hr))
- {
- break;
- }
- pDoc->async = VARIANT_FALSE;
- if (VARIANT_TRUE != pDoc->load(lpszPath))
- {
- break;
- }
- pNode = pDoc->selectSingleNode("/request/username");
- cout << "user name = " << static_cast<char*>(pNode->text) << endl;
- pNode = pDoc->selectSingleNode("/request/password");
- cout << "password = " << static_cast<char*>(pNode->text) << endl;
- pNode = pDoc->selectSingleNode("/request/cmdlines");
- MSXML2::IXMLDOMNamedNodeMapPtr pmapName = NULL;
- pmapName = pNode->attributes;
- pNode = pmapName->getNamedItem("count");
- cout << "count = " << static_cast<char*>(pNode->text) << endl;
- pNode = pmapName->getNamedItem("reply");
- cout << "reply = " << static_cast<char*>(pNode->text) << endl;
- pNode = pmapName->getNamedItem("immediate");
- cout << "immediate = " << static_cast<char*>(pNode->text) << endl;
- MSXML2::IXMLDOMNodeListPtr plsNode = NULL;
- plsNode = pDoc->selectNodes("/request/cmdlines/cmd");
- assert(2 == plsNode->length);
- cout << "cmd group 1: " << endl;
- pNode = plsNode->item[0]->selectSingleNode("type");
- cout << "type = " << static_cast<char*>(pNode->text) << endl;
- pNode = plsNode->item[0]->selectSingleNode("dbname");
- cout << "dbname = " << static_cast<char*>(pNode->text) << endl;
- cout << "cmd group 2: " << endl;
- pNode = plsNode->item[1]->selectSingleNode("type");
- cout << "type = " << static_cast<char*>(pNode->text) << endl;
- pNode = plsNode->item[1]->selectSingleNode("data");
- cout << "data = " << static_cast<char*>(pNode->text) << endl;
- } while (0);
- if (pDoc)
- {
- pDoc.Release();
- pDoc = NULL;
- }
- if (pNode)
- {
- pNode.Release();
- pNode = NULL;
- }
- return TRUE;
- }
生成的XML文件:
Sample xml file create using xml dom object-->
运行结果:
<?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