VC++讀寫XML文件

1、安裝MSXML 4.0 SP2。在VC6中建立一個基於Dialog的工程。如圖:

XML.JPG

在界面上放置3個編輯框、1個按鈕控件。其中屬性設置如下。
編輯框:

ID Category Variable Type Variable Name
IDC_ID Value CString m_strId
IDC_AUTHOR Value CString m_strAuthor
IDC_TITLE Value CString m_strTitle
按鈕:
ID Caption
IDC_GENERATE Generate
IDC_LOAD Load


2、在StdAfx.h中引入動態鏈接庫 MSXML.DLL(C:/windows/system32/msxml4.dll)


#import <msxml4.dll>

3.在我們要操作XMLcpp文件開始部分加入:

   using namespace MSXML2;


4、雙擊Generate按鈕,在消息處理函數中添加如下代碼:

::CoInitialize(NULL); //初始化COM


UpdateData(TRUE);
MSXML2::IXMLDOMDocumentPtr pDoc; 
MSXML2::IXMLDOMElementPtr  xmlRoot ; 
//創建DOMDocument對象

HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); 
if(!
SUCCEEDED(hr)) 
{  
 MessageBox(
"無法創建DOMDocument對象,請檢查是否安裝了MS XML Parser 運行庫!"
); 
 
return
 ;
}
 
//
根節點的名稱爲Book
//創建元素並添加到文檔中

xmlRoot=pDoc->createElement((_bstr_t)"Book ");
//設置屬性

xmlRoot->setAttribute("id",( const char * )m_strId);
pDoc
->
appendChild(xmlRoot);
MSXML2::IXMLDOMElementPtr pNode;
//添加“author”元素

pNode=pDoc->createElement((_bstr_t)"Author ");
pNode
->Puttext((_bstr_t)(const char  *
)m_strAuthor);
xmlRoot
->
appendChild(pNode);
//添加“Title”元素

pNode=pDoc->createElement("Title ");
pNode
->Puttext((const char  *
)m_strTitle);
xmlRoot
->
appendChild(pNode);
//
保存到文件 
//如果不存在就建立,存在就覆蓋 

pDoc->save("d://he.xml");

雙擊Load按鈕,在消息處理函數中添加如下代碼:

MSXML2::IXMLDOMDocumentPtr pDoc;
HRESULT hr;
hr
=
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if
(FAILED(hr))
{  
 MessageBox(
"無法創建DOMDocument對象,請檢查是否安裝了MS XML Parser 運行庫!"
); 
 
return
 ;
}
 
//加載文件 

pDoc->load("d://he.xml"); 
MSXML2::IXMLDOMNodePtr  pNode;
//在樹中查找名爲Book的節點,"//"表示在任意一層查找 

pNode=pDoc->selectSingleNode("//Book ");
MSXML2::DOMNodeType nodeType; 
//得到節點類型 

pNode->get_nodeType(&nodeType); 
//節點名稱 

CString strName;
strName
=(char  *)pNode->
GetnodeName();
//節點屬性,放在鏈表中 

MSXML2::IXMLDOMNamedNodeMapPtr pAttrMap=NULL;
MSXML2::IXMLDOMNodePtr   pAttrItem;
_variant_t variantvalue;
pNode
->get_attributes(&
pAttrMap);
long
 count;
count
=pAttrMap->get_length(&
count);
pAttrMap
->get_item(0,&
pAttrItem);
//取得節點的值

pAttrItem->get_nodeTypedValue(&variantvalue);
m_strId
=(char  *
)(_bstr_t)variantvalue;
UpdateData(FALSE);

 

 

瀏覽XML

 ::CoInitialize(NULL); //初始化COM
 MSXML2::IXMLDOMDocumentPtr pDoc;
 HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
 if(!SUCCEEDED(hr))
 {
  MessageBox("Error!");
  return;
 }

 pDoc->load("E:\\test.xml");
 MSXML2::IXMLDOMElementPtr childNode;
 MSXML2::IXMLDOMElementPtr childNode1;
 MSXML2::IXMLDOMNodeListPtr nodeList;
 MSXML2::IXMLDOMNodeListPtr nodeList1;
 childNode1 = (MSXML2::IXMLDOMElementPtr)(pDoc->selectSingleNode("//video"));//選中節點
 nodeList = childNode1->GetchildNodes();//子節點列表
// MSXML2::DOMNodeType nodeType;
// nodeList=pDoc->getElementsByTagName_r("avi");//獲取所有名爲avi的節點,可以在bitmap節中介入avi節實驗

 MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
 MSXML2::IXMLDOMNodePtr pAttrItem;
 MSXML2::IXMLDOMNodePtr pAttrItem1;
 
 long nCount, iCount;
 nodeList->get_length(&iCount); //獲取節點個數
 BOOL bDel = FALSE;
 for(int i=0 ;i<iCount; i++) //根據需要可以添加數據到ListControl中
 {
  childNode = nodeList->Getitem(i).Detach();//得到一個節點

  childNode->get_attributes(&pAttrs);
  pAttrs->get_length(&nCount); //獲取節點屬性個數
   nodeList->get_item(i, &pAttrItem1);
  for(int j = 0; j < nCount; j++)
  {
   pAttrs->get_item(j, &pAttrItem);
   CString strAttrName = (char*)(_bstr_t)pAttrItem->nodeName;
   CString strAttrValue = (char*)(_bstr_t)pAttrItem1->nodeTypedValue;
  }
 }

 

發佈了34 篇原創文章 · 獲贊 7 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章