轉載:VC DOM 操作XML

操作XML有兩種方法:一種是DOM 另一種是ASX 這兩種的區別在於:DOM在讀取XML文檔時要把整個文件都放入內存,然後形成一個完整的DOM樹,然後再解析.因此,DOM對於大型文件常常力不從心.而ASX則是讀取一行解析一行,不必把所有內容都放入內存.因此適合大型文件的讀取.

 

這不,最近自己也遇到這方面的問題.硬着頭皮把別人的代碼閱讀了一遍,基本掌握了創建 獲取XML文檔的流程.現介紹如下:

 

1.在你的APP類裏面的InitInstance()函數裏面添加函數AfxOleInit();進行COM口初始化

 

2.在具體實現的函數前面引入用於解釋XML的dll 代碼:#import "msxml4.dll"

 

2.創建XML

 

   1).聲明並創建一個DOM對象

 

     首先聲明一個指向DOM對象的智能指針: MSXML2::IXMLDOMDocumentPtr pDoc;

 

       再聲明一個指向根節點的智能指針:      MSXML2::IXMLDOMElementPtr xmlRoot;

 

<附註:智能指針 類似於一個對象,在應用程序關閉之後,可以自動釋放指針指向的那部分空間,好象一個類默認就有構造函數和析構函數一樣.這樣可以防止程序員的疏忽造成內存泄露>

 

   然後開始創建DOM對象:HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));

 

創建根節點:     pDoc->raw_createElement((_bstr_t)(char*)"china", &xmlRoot);

 

pDoc->raw_appendChild(xmlRoot, NULL);

 

2):添加子節點並賦值

 

MSXML2::IXMLDOMElementPtr childNode; //聲明一個指向子節點的智能指針       

pDoc->raw_createElement((_bstr_t)(char*)"City", &childNode);//dom對象創建這個節點並賦值

 

//////////////////////////////////////1/////////////////////////////////

 

爲節點賦值: childNode->Puttext("WuHan");

 

childNode->setAttribute("population","8,000,000");//屬性名,屬性值

 

childNode->setAttribute("area","10000");//屬性名 屬性值

xmlRoot->appendChild(childNode);//將該節點加入根節點下面,使它成爲根節點的子節點

 

同樣道理:再加兩個類似的子節點並分別賦值

 

//////////////////////////////////2//////////////////////////////////////

 

pDoc->raw_createElement((_bstr_t)(char*)"City", &childNode);

childNode->Puttext("ShangHai");

childNode->setAttribute("population","12,000,000");

childNode->setAttribute("area","12000");

xmlRoot->appendChild(childNode);

/////////////////////////////3//////////////////////////////////////// 

pDoc->raw_createElement((_bstr_t)(char*)"City", &childNode);

childNode->Puttext("ChengDu");

childNode->setAttribute("population","13,000,000");

childNode->setAttribute("area","15000");

xmlRoot->appendChild(childNode);

 

////////////////////////保存到文件/////////////////////////

 

pDoc->save("f://he.xml");   //如果不存在就建立,存在就覆蓋

 

到這裏就完成了創建一個XML的全部過程,接下來看讀取

 

////////////////////////////////////////讀取///////////////////////////////////

 

1.同創建 也要先聲明一個DOM 對象

 

MSXML2::IXMLDOMDocumentPtr pDoc; 

HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));

if(!SUCCEEDED(hr)) 

{                

   MessageBox("無法創建DOMDocument對象,請檢查是否安裝了MS XML Parser 運行庫!"); 

   return;

}

 

2.加載文件//////////////////////////////////////////////////////////////////

 

pDoc->load("f://he.xml");

 

3.讀取///////////////

 

CString str1;

MSXML2::IXMLDOMElementPtr childNode ;//先聲明子節點的指針

 

MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL; 

MSXML2::IXMLDOMNodePtr pAttrItem;

 

long nCount ;

for (int j = 0 ;j < 3;j++)

{

   str1.Format("//City[%d]",j);

   //在樹中查找名爲City的節點,"//"表示在任意一層查找

   childNode = (MSXML2::IXMLDOMElementPtr)(pDoc->selectSingleNode((_bstr_t)str1));

 

   //得到節點類型

   MSXML2::DOMNodeType nodeType;

   childNode->get_nodeType(&nodeType);

 

   //節點名稱

   BSTR var;

   CString name;

   childNode->get_nodeName(&var);

   name = (char*)(_bstr_t)var;

 

   //節點值

   VARIANT varVal;

   childNode->get_nodeTypedValue(&varVal);

   CString strValue = (char*)(_bstr_t)varVal;

 

   //節點屬性,放在鏈表中

   childNode->get_attributes(&pAttrs);

   pAttrs->get_length(&nCount);

   for(int i = 0 ; i < nCount ; i++)

   {                 

    pAttrs->get_item(i,&pAttrItem);

    //我們可以通過函數get_nodeName,get_nodeTypedValue得到屬性名和屬性值

    //也可以直接得到

    CString strAttrName   = (char*)(_bstr_t)pAttrItem->nodeName;

    CString strAttrValue = (char*)(_bstr_t)pAttrItem->nodeTypedValue;

    CString temp;

    temp.Format("%s/t%s/t%s",strValue,strAttrName,strAttrValue);

    AfxMessageBox(temp);

   }

}

 

轉載地址:http://hi.baidu.com/strongpig/blog/item/7e186c3eb232e13370cf6c3d.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章