程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> C++中處理XML文件

C++中處理XML文件

編輯:.NET實例教程
寫Unmanaged Code在.Net時代成為一種很悲慘的事,當你需要處理XML文件時,這種感覺會變得尤其強烈。FCL中的System.XML多簡單啊,連Steve Ballmer都知道怎麼用。

事情不會總是那麼理想的,如果你要在C/C++程序裡處理XML怎麼辦呢?

選擇一:市面上的XML lib還是有幾個的,最有名的當然是libXML。我一年前用過,很不錯,我還特意寫了一份簡明教程,後來不知擱哪兒了。

選擇二:MS的MSXML,我要介紹的就是這個。

先說一下在MSDN哪裡找文檔吧,往下看的時候也好有個參考:在Index裡打:Windows Media Services 9 SerIEs SDK=>Programming Reference=>Programming Reference (C++)=>XML DOM Interfaces (C++)。什麼?Windows Media?呵呵,不錯,我覺得這個guide反而是最清楚的,你直接找MSXML,得到的結果,我覺得還沒這個好。

在C程序裡調用MSXML基本就是一堆COM接口,不過在Visual Studio裡操作先要做點簡單的設置:

在你的Project裡Add References=>COM標簽=>Microsoft XML v4.0,5.0其實也有了,但因為是和Office一起發布的,覺得有點怪,不想用,反正也未必用什麼很怪異的功能,4.0可以了。



然後在加入這兩行:

#include <msXML2.h>
#import <msXML4.dll>

頭文件和dll庫。什麼?在哪裡加?頭文件或者c/cpp文件啊,哪裡合適放哪兒。

然後就開始編程了,先定義兩個必用的變量:

IXMLDOMDocumentPtr XMLFile = NULL;
IXMLDOMElement* XMLRoot = NULL;

為什麼是必用的?  汗...

第一步當然是初始化COM:

if(FAILED(CoInitialize(NULL))) ....

接下來初始化XMLFile對象:

if(FAILED(xmlFile.CreateInstance("MsXML2.DOMDocument.4.0"))) ...

然後就可以加載XML文件了:

_variant_t varXml(L"C:\\test.XML"); //L for unicode
VARIANT_BOOL varOut;
xmlFile->load(varXML, &varOut);

取得root element:

xmlFile->get_documentElement(&XMLRoot))

取得第一級element:

IXMLDOMNodeList* XMLChildNodes = NULL;
xmlRoot->get_childNodes(&XMLChildNodes);

遍歷所有第一級element:

IXMLDOMNode* currentNode = NULL;
while(!FAILED(XMLChildNodes->nextNode(&currentNode)) && currentNode != NULL)
{
//do something
}

取得當前element的名稱:

BSTR nodeName;
currentNode->get_nodeName(&nodeName);

取得當前element的一個attribute(假設這個attribute叫type)的值:

IXMLDOMNamedNodeMap* attributes = NULL;
IXMLDOMNode* attributeName = NULL;
_bstr_t bstrAttributeName = "type";
BSTR nameVal;
currentNode->get_attributes(&attributes);
attributes->getNamedItem(bstrAttributeName, &attributeName);
attributeName->get_text(&nameVal);

需要注意的是,你要記住釋放所有的借口,IXMLDOM***->Release(),這可不是.Net,有人幫你GC
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved