一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

C++中處理XML文件...

 shaolong007 2005-09-30
C++中處理XML文件

8){NewaspContentLabel.style.fontSize=(--newasp_fontsize)+"pt";NewaspContentLabel.style.lineHeight=(--newasp_lineheight)+"pt";}‘>減小字體 增大字體

寫Unmanaged Code在.NET時代成為一種很悲慘的事,當(dāng)你需要處理XML文件時,這種感覺會變得尤其強(qiáng)烈。FCL中的System.Xml多簡單啊,連Steve Ballmer都知道怎么用。

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

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

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

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

在C程序里調(diào)用MSXML基本就是一堆COM接口,不過在Visual Studio里操作先要做點簡單的設(shè)置:

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

 

然后在加入這兩行:

#include <msxml2.h>
#import <msxml4.dll>

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

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

IXMLDOMDocumentPtr xmlFile = NULL;
IXMLDOMElement* xmlRoot = NULL;

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

第一步當(dāng)然是初始化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
}

取得當(dāng)前element的名稱:

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

取得當(dāng)前element的一個attribute(假設(shè)這個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,你得自己調(diào)用Release()來減reference count,it‘s COM, remember?

好了,大致就這樣,順便提一下XPath:

_bstr_t bstrXmlQuery = L"/books/book[@type=scifi and @author=fox]";
IXMLDOMNodeList* nodes = NULL;
if(FAILED(xmlRoot->selectNodes(bstrXmlQuery, &nodes)) || FAILED(nodes->get_length(&length)) || length == 0)
//no match found or something went wrong
else
//match found

上面是找這樣的node:

<books>
<book type="scifi" author="fox">....
</book>
....
</books>

具體的XPath語法就查手冊吧,到處都有。

哦,對了,忘了說:如果你全部用ATL的類的話,借口的調(diào)用會簡單一點,不過很容易轉(zhuǎn)換的,比如:

IXMLDOMDocument* 對應(yīng) IXMLDOMDocumentPtr(我這里用了),其他基本也是加個Ptr,我不廢話了。

最后提供一個sample,我臨時攢的。工作的時候?qū)懙某绦虍?dāng)然不能拿來貼的,呵呵。這個sample基本就是遍歷整個xml,然后報告一遍文件的結(jié)構(gòu),對每個node,如果它有一個叫id的attribute,就同時打印id的值。If you want the complete VS project, shoot me an email. But I guess no one really needs it anyway, right, : )

#include "stdafx.h"
#include <windows.h>
#include <msxml2.h>
#import <msxml4.dll>

HANDLE logFile = NULL;

#define INDENT 4

#define TESTHR(hr) \
{ \
if(FAILED(hr)) goto fail; \
}

void PrintChild(IXMLDOMNodeList* nodeList, int level)
{
if(nodeList == NULL)
return;

IXMLDOMNode* currentNode = NULL;
IXMLDOMNodeList* childNodes = NULL;
IXMLDOMNamedNodeMap* attributes = NULL;
IXMLDOMNode* attributeID = NULL;

while(!FAILED(nodeList->nextNode(&currentNode)) && currentNode != NULL)
{
BSTR nodeName;
TESTHR(currentNode->get_nodeName(&nodeName));
DWORD dwBytesWritten;
for(int i=0; i<level*INDENT; i++)
WriteFile(logFile, L" ", (DWORD)(sizeof(WCHAR)), &dwBytesWritten, NULL);

//WCHAR msg[MAX_SIZE];
//wsprintf(msg, L"%s ", nodeName);
WriteFile(logFile, nodeName, (DWORD)(wcslen(nodeName)*sizeof(WCHAR)), &dwBytesWritten, NULL);

TESTHR(currentNode->get_attributes(&attributes));
if(attributes!=NULL)
{
_bstr_t bstrAttributeName = "id";
BSTR idVal;
TESTHR(attributes->getNamedItem(bstrAttributeName, &attributeID));
if(attributeID != NULL)
{
TESTHR(attributeID->get_text(&idVal));
WriteFile(logFile, L" ", (DWORD)(sizeof(WCHAR)), &dwBytesWritten, NULL);
WriteFile(logFile, idVal, (DWORD)(wcslen(idVal)*sizeof(WCHAR)), &dwBytesWritten, NULL);
WriteFile(logFile, L"\r\n", (DWORD)(2*sizeof(WCHAR)), &dwBytesWritten, NULL);
attributeID->Release(); attributeID = NULL;
}
else
{
WriteFile(logFile, L"\r\n", (DWORD)(2*sizeof(WCHAR)), &dwBytesWritten, NULL);
}
attributes->Release(); attributes = NULL;

}
else
{
WriteFile(logFile, L"\r\n", (DWORD)(2*sizeof(WCHAR)), &dwBytesWritten, NULL);
}

TESTHR(currentNode->get_childNodes(&childNodes));
PrintChild(childNodes, level+1);
currentNode=NULL;
}

fail:
if(childNodes!=NULL)
childNodes->Release();
if(attributeID!=NULL)
attributeID->Release();
if(attributes!=NULL)
attributes->Release();
if(currentNode != NULL)
currentNode->Release();
}

int _tmain(int argc, _TCHAR* argv[])
{

IXMLDOMDocumentPtr xmlFile = NULL;
IXMLDOMElement* xmlRoot = NULL;
_variant_t varXml(L"C:\\demo1.xml");

logFile = CreateFile(L"log.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(logFile == INVALID_HANDLE_VALUE)
goto fail;

TESTHR(CoInitialize(NULL));

TESTHR(xmlFile.CreateInstance("Msxml2.DOMDocument.4.0"));

VARIANT_BOOL varOut;
TESTHR(xmlFile->load(varXml, &varOut));

TESTHR(xmlFile->get_documentElement(&xmlRoot));

BSTR rootName;
DWORD dwBytesWritten;
TESTHR(xmlRoot->get_nodeName(&rootName));
WriteFile(logFile, rootName, (DWORD)(wcslen(rootName)*sizeof(WCHAR)), &dwBytesWritten, NULL);
WriteFile(logFile, L"\r\n", (DWORD)(2*sizeof(WCHAR)), &dwBytesWritten, NULL);

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

PrintChild(xmlChildNodes, 2);

fail:
if(logFile != INVALID_HANDLE_VALUE)
CloseHandle(logFile);
if(xmlChildNodes!=NULL)
xmlChildNodes->Release();
if(xmlRoot!=NULL)
xmlRoot->Release();
return 0;
}

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日本亚洲精品在线观看| 精品日韩国产高清毛片| 好吊妞视频这里有精品| 亚洲国产精品无遮挡羞羞| 91欧美日韩一区人妻少妇| 国产精品日韩精品最新| 国产户外勾引精品露出一区 | 日韩性生活视频免费在线观看| 九九热精品视频免费在线播放| 日本91在线观看视频| 国内午夜精品视频在线观看| 日本本亚洲三级在线播放| 视频一区日韩经典中文字幕| 国内自拍偷拍福利视频| 熟女乱一区二区三区丝袜| 日韩欧美高清国内精品| 国产免费自拍黄片免费看| 午夜国产精品国自产拍av| 国产精品免费自拍视频| 国自产拍偷拍福利精品图片| 三级理论午夜福利在线看| 天堂网中文字幕在线视频| 中文字幕人妻日本一区二区| 好吊日视频这里都是精品| 国产精品超碰在线观看| 视频一区二区黄色线观看| 免费观看成人免费视频| 人妻少妇久久中文字幕久久| 国产一二三区不卡视频| 99久免费精品视频在线观| 一区二区三区日韩中文| 亚洲一区二区欧美在线| 日本在线不卡高清欧美 | 99热九九在线中文字幕| 亚洲天堂国产精品久久精品| 亚洲午夜av久久久精品| 国产又大又黄又粗又免费| 国产欧美日产中文一区| 欧美成人免费夜夜黄啪啪| 好吊视频一区二区在线| 日韩国产亚洲一区二区三区|