原文地址http://book.51cto.com/art/200908/145797.htm
6.4.3 使用MsXML存取XML(2)
現在動手
對應於如上的JavaScript代碼,我們接下來實現存取persons.xml文件的Visual C++版本。
【程序 6-8】使用MsXML讀寫XML文件
- 01 #include "stdafx.h"
- 02 #include "comutil.h"
- 03 #include <clocale>
- 04
- 05 #import "msxml4.dll"
- 06
- 07 void WritePerson(MSXML2::IXMLDOMDocument2Ptr pDocument,
- MSXML2::IXMLDOMNodePtr pParentNode, CString name, long age)
- 08 {
- 09 //創建一個<person>節點
- 10 MSXML2::IXMLDOMElementPtr pPersonNode =
pDocument->createElement(_T("person")); - 11 pParentNode->appendChild(pPersonNode);
- 12
- 13 //寫入name
- 14 MSXML2::IXMLDOMElementPtr pPersonNameNode =
pDocument->createElement(_T("name")); - 15 pPersonNameNode->text = _bstr_t(name);
- 16
- 17 //寫入age
- 18 MSXML2::IXMLDOMElementPtr pPersonAgeNode =
pDocument->createElement(_T("age")); - 19 pPersonAgeNode->text = _bstr_t(age);
- 20
- 21 pPersonNode->appendChild(pPersonNameNode);
- 22 pPersonNode->appendChild(pPersonAgeNode);
- 23 }
- 24
- 25 void WritePersons()
- 26 {
- 27 MSXML2::IXMLDOMDocument2Ptr pXMLDocument;
- 28 pXMLDocument.CreateInstance(__uuidof(MSXML2::DOMDocument));
- 29 MSXML2::IXMLDOMElementPtr pPersonsNode =
- pXMLDocument->createElement(_T("persons"));
- 30 pXMLDocument->appendChild(pPersonsNode);
- 31
- 32 WritePerson(pXMLDocument, pPersonsNode, _T("佟湘玉"), 28);
- 33 WritePerson(pXMLDocument, pPersonsNode, _T("白展堂"), 27);
- 34
- 35 pXMLDocument->save(_T("persons.xml"));
- 36 }
- 37
- 38 void ReadPersons()
- 39 {
- 40 MSXML2::IXMLDOMDocument2Ptr pXMLDocument;
- 41 pXMLDocument.CreateInstance(__uuidof(MSXML2::DOMDocument));
- 42
- 43 pXMLDocument->load(_T("persons.xml"));
- 44
- 45 MSXML2::IXMLDOMElementPtr pRootNode =
pXMLDocument->documentElement; - 46 //查找<person>節點
- 47 MSXML2::IXMLDOMNodeListPtr pPersonNodes =
pRootNode->selectNodes(_T("person")); - 48
- 49 CString s;
- 50 long size = pPersonNodes->length;
- 51
- 52 for(int i = 0; i < size; i++)
- 53 {
- 54 MSXML2::IXMLDOMNodePtr pPersonNode =
pPersonNodes->item[i]; - 55
- 56 MSXML2::IXMLDOMNodePtr pNameNode =
pPersonNode->selectSingleNode(_T("name")); - 57 MSXML2::IXMLDOMNodePtr pAgeNode =
pPersonNode->selectSingleNode(_T("age")); - 58
- 59 s.Format(_T("%sname: %s/tage: %s/r/n"),
s, (LPCTSTR)pNameNode-> - text, (LPCTSTR)pAgeNode->text);
- 60 }
- 61
- 62 _tprintf(s);
- 63 }
- 64
- 65 int _tmain()
- 66 {
- 67 setlocale(LC_ALL, "chs");
- 68
- 69 HRESULT hr;
- 70 hr = ::CoInitialize(NULL);
- 71
- 72 WritePersons();
- 73 ReadPersons();
- 74
- 75 ::CoUninitialize();
- 76 return 0;77 }
運行結果如圖6-27所示。
圖6-27 運行結果 |
在Visual C++中,調用COM組件比較省力、安全的辦法是使用#import方式,關於此方式,讀者朋友們可參見第14.3.7小節"使用#import方式調用COM組件"。另外,MsXML的版本不同,其提供的DLL文件名也不同,如MSXML 4.0對應的DLL爲"msxml4.dll"。細心的讀者可能會發現,一旦在程序中導入了msxml4.dll並build(生成)一次項目,在程序中就可以自動引入一些類,如:MSXML2::IXMLDOMDocument2Ptr,MSXML2是一個C++名字空間,IXMLDOMDocument2Ptr則是一個封裝了IXMLDOMDocument對象操作的智能指針類。好奇的讀者可以選擇"IXMLDOMDocument2Ptr",並查看其定義,就可以跟蹤到Debug目錄下一個叫着msxml4.tlh的頭文件,它是由Visual C++從msxml4.dll中自動提取並生成的C++頭文件,與此一起生成的還有其他的文件,如msxml4.tli等。
光盤導讀
該項目對應於光盤中的目錄"/ch06/MsXmlTest"。
MSDN參考
欲在MSDN中查看相關信息,可使用關鍵字:"MSXML,API history"。