操作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