XML程式設計例項(二) (轉)

worldblog發表於2007-12-04
XML程式設計例項(二) (轉)[@more@]

例項(二)

模型:
 
前面已經說了,對於DOM模型來說,整個XML被解析成一個樹形的結構。所有的標籤、屬性等都被當作來看待。所以,必須瞭解清楚物件的含義,及其相互關係,方能正確操作。
  為了先有一個感性認識,讓我們開始吧。(為了方便說明,程式碼裡基本上沒有異常處理) microsoft-com::office" />

生成一個XML文字

假設我們要建立一個如下的XML文字

  -11
  9
 

我們首先應該先建立一個Document物件,如下:MSXML::IXMLDOMDocumentPtr pDoc;
pDoc.CreateInstance(__uuidof(MSXML::DOMDocument));

如果建立成功,那麼我們就會得到一個XMLDOMDocument物件例項。
下一步就是新增 根節點DocumentElement,記住XML只有一個根。

建立Element物件 作為根節點
MSXML::IXMLDOMElementPtr pDocElement=pDoc->createElement("China"); 

把根節點插入到目錄樹中
pDoc->appendChild(pDocElement); 

好了,生成一個樹根了,我們現在來看一看結果:
用pDoc -> xml 可以取得整個DOM物件的文字
因為樹根下沒有任何東西,所以只顯示 

現在,我們要在樹根下插入子節點,並設定節點文字(Text)
MSXML::IXMLDOMElementPtr pNewChildElement;
pNewChildElement=pDoc->createElement("Beijing");
pNewChildElement->Puttext("-11"); 
pDocElement->appendChild(pNewChildElement); 

這時候整個的 XML文字應該為

  -11
 

再增加一個子節點,並設定節點屬性(Attribute)pNewChildElement=pDoc->createElement("Shanghai");
pNewChildElement->Puttext("9"); 
pNewChildElement->setAttribute("Weather",_variant_t("Cloudy")); pDocElement->appendChild(pNewChildElement); 

於是,我們就可以得到預期的XML文字了。
其他的操作:

刪除操作
  從父節點來刪除子節點pDocElement->removeChild(pNewChildElement)
存檔操作
  pDoc->Save();

裝載已有XML文字 

如果我們已經有了一個XML檔案,想對其進行解析,那麼可以使用Document 物件的Load或LoadXML來進行載入,並在載入的同時進行語法分析。 

如果載入成功,那麼就會在中生成一個樹形結構。利用DOM模型,我們就可以進行各種操作。最常見的是,我們需要尋找特定的資訊,並進行處理。

查詢定位
使用SingleNode (),SelectNodes(XPath)來定位標籤,取得對應的Node(s)物件。
 XPath
 XPath是類似於檔案路徑名的字串,也像的查詢語句,可以限定查詢範圍。
找到指定物件,我們就可各種處理了,新增、刪除、取值等等。

小結:上面僅僅是對DOM模型的程式設計進行了簡單的介紹,以期。要詳細瞭解,還必須查閱SDK的文件。如果可能,將在以後介紹SAX 模型、T對 XML的轉換等。 

相關連結:要使用MSXML Parser ,你必須先其SDK和執行庫。
.microsoft.com/download/xml/Install/3.0/Me/EN-US/msxml3.exe">
 

//-------------下面是程式碼例項-----------

#include "stdafx.h"
#include "iostream.h"
#include "msxml.h"
#include "atlbase.h"
#import  "msxml.dll"  //引入型別庫 

#ifdef _DE
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif 

int Exit();
void LoadFromString();
void CreateXML(); 

//XML文字模板
_bstr_t XMLTemple=" -11 9 "; 

int main()
{
  cout << " XML程式設計--示範 " << endl; 

  CoInitialize(NULL);  //初始化環境 

  cout << "------生成新的XML文字 ------" << endl;

  CreateXML();

  cout << "------讀取已有XML文字 ------" << endl;

  LoadFromString();
  return Exit();

}
void CreateXML()
{
  MSXML::IXMLDOMDocumentPtr pDoc;
  HRESULT hr =pDoc.CreateInstance(__uuidof(MSXML::DOMDocument)); 
  if(!SUCCEEDED(hr))
  {

    cout << "無法建立DOMDocument物件,請檢查是否了MS XML Parser 執行庫!" << endl;
  Exit();

  }

  MSXML::IXMLDOMElementPtr pDocElement=pDoc->createElement("China");

  pDoc->appendChild(pDocElement);

  cout << "生成樹根:n" << pDoc->xml << endl;

  MSXML::IXMLDOMElementPtr pNewChildElement;

  pNewChildElement=pDoc->createElement("Beijing");

  pNewChildElement->Puttext("-11"); 

  pDocElement->appendChild(pNewChildElement);

  cout << "新增節點:n" << pDoc->xml << endl;

  pNewChildElement=pDoc->createElement("Shanghai");

  pNewChildElement->Puttext("9"); 

  pNewChildElement->setAttribute("Weather",_variant_t("Cloudy"));

  pDocElement->appendChild(pNewChildElement);

  cout << "再新增節點:n" << pDoc->xml << endl;

  pDocElement->removeChild (pNewChildElement);

  cout << "把剛加入的節點刪除:n" << pDoc->xml << endl;

}

 

void LoadFromString()
{

  MSXML::IXMLDOMDocumentPtr pDoc;

  HRESULT hr =pDoc.CreateInstance(__uuidof(MSXML::DOMDocument));

  if(!SUCCEEDED(hr))

  {
  cout << "無法建立DOMDocument物件,請檢查是否安裝了MS XML Parser 執行庫!" << endl;
  Exit();

  }

  pDoc->loadXML(XMLTemple);

  cout << "讀取結果:n" << pDoc->xml << endl;

  MSXML::IXMLDOMElementPtr pDocElement=pDoc->GetdocumentElement();

  MSXML::IXMLDOMElementPtr pElement=pDocElement->selectSingleNode("Shanghai");

  pDocElement->removeChild(pElement);

  cout << "定位刪除Shanghai節點:n" << pDoc->xml << endl;

  cout << "儲存結果 Save .....(模擬而已)" << endl;

  cout << "n 好了,就這麼簡單" << endl;

int Exit()

  getchar();
  return 1;
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988461/,如需轉載,請註明出處,否則將追究法律責任。

相關文章