vc实现xml的操作

来源:互联网 发布:在线手机淘宝 编辑:程序博客网 时间:2024/06/11 06:00

<![endif]--> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:PMingLiU; panose-1:2 2 3 0 0 0 0 0 0 0; mso-font-alt:新細明體; mso-font-charset:136; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 137232384 22 0 1048577 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@PMingLiU"; panose-1:2 2 3 0 0 0 0 0 0 0; mso-font-charset:136; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 137232384 22 0 1048577 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:1153717841; mso-list-template-ids:842289830;} @list l0:level1 {mso-level-tab-stop:36.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l1 {mso-list-id:1918009290; mso-list-template-ids:1961924960;} @list l1:level1 {mso-level-tab-stop:36.0pt; mso-level-number-position:left; text-indent:-18.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} --> <![endif]-->

最近,由于工作需要程序生成 XML 的索引记录文件,特将 VC++ 读写 XML 文件的方法总结如下(参考自: http://blog.csdn.net/firebird321/archive/2008/03/17/2190847.aspx)

首先:建立一个基于 Dialog MFC 工程,工程名为 OperateXML ,然后在对话框上添加两个按钮 ("Create" "GetData" 和一个 ListControl
控件 ( 用来显示数据 ) ,首先要导入库文件
#import "msxml3.dll"
using namespace MSXML2;
主要用来实现 XML 文件的相关操作,
双击 "Create" 按钮进入代码编写,代码如下:
void COperateXML::OnBtnCreate()
{
// TODO: Add your control notification handler code here
::CoInitialize(NULL); //
初始化 COM
MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr xmlRoot;
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(hr))
{
   MessageBox("Error");
   return;
}
pDoc->raw_createElement((_bstr_t)(char*)"china", &xmlRoot);
pDoc->raw_appendChild(xmlRoot, NULL);

MSXML2::IXMLDOMElementPtr childNode;
pDoc->raw_createElement((_bstr_t)(char*)"city", &childNode);
childNode->Puttext("shanghai");
childNode->setAttribute("population", "7000");
childNode->setAttribute("area", "2000");
xmlRoot->appendChild(childNode);

pDoc->raw_createElement((_bstr_t)(char*)"city", &childNode);
childNode->Puttext("beijing");
childNode->setAttribute("population", "39999");
childNode->setAttribute("area", "3322");
xmlRoot->appendChild(childNode);

pDoc->save("D://test.xml");
}

双击 "GetData" 按钮进入代码编写,代码如下:
void COperateXML::OnBtnGet()
{
// TODO: Add your control notification handler code here
m_list.DeleteAllItems();
MSXML2::IXMLDOMDocumentPtr pDoc;
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(hr))
{
   MessageBox("Error!");
   return;
}
pDoc->load("D://test.xml");
MSXML2::IXMLDOMElementPtr childNode;
childNode = (MSXML2::IXMLDOMElementPtr)(pDoc->selectSingleNode("//city"));

MSXML2::DOMNodeType nodeType;
childNode->get_nodeType(&nodeType);

MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
MSXML2::IXMLDOMNodeListPtr nodeList;
MSXML2::IXMLDOMNodePtr pAttrItem;
childNode->get_attributes(&pAttrs);
childNode->get_childNodes(&nodeList);
long nCount, iCount;
pAttrs->get_length(&nCount); //
获取节点属性个数
nodeList->get_length(&iCount); //
获取节点个数
for(int i = 0; i < iCount; i++) //
根据需要可以添加数据到 ListControl
{
   for(int j = 0; j < nCount; j++)
   {
    pAttrs->get_item(j, &pAttrItem);
    CString strAttrName = (char*)(_bstr_t)pAttrItem->nodeName;
    CString strAttr = (char*)(_bstr_t)pAttrItem->nodeType;
    m_list.InsertItem(i, strAttrName);
    m_list.SetItemText(i, 1, strAttr);
   }
}

}

ListControl 控件绑定一个操作变量

CListCtrl m_list;

OnInitDialog 中初始化,代码如下:

BOOL COperateXML::OnInitDialog()
{
// TODO: Add extra initialization here
m_list.InsertColumn(0, "
人口 ");
m_list.InsertColumn(1, "Num");
m_list.InsertColumn(1, "
面积 ");
m_list.InsertColumn(1, "Num");
CRect rect;
m_list.GetClientRect(&rect);
int width = (rect.right - rect.left) / 4;
m_list.SetColumnWidth(0, width);
m_list.SetColumnWidth(1, width);
m_list.SetColumnWidth(2, width);
m_list.SetColumnWidth(3, width);
}

F7 编译程序, Ctrl F5 查看显示结果,至此一个简单的操作 XML 文件的实现已经成功的完成了。

程序代码

  1. #import "msxml6.dll" named_guids raw_interfaces_only
  2. #include <msxml.h>
  3. using namespace MSXML2;
  4.  
  5. using namespace std;
  6. int testXml(wstring strfilname)
  7. {
  8.     cout << "BEGIN" << endl;
  9.  
  10.     HRESULT hr;
  11.     long cnt;
  12.  
  13.     try
  14.     {
  15.         MSXML2::IXMLDOMDocumentPtr pDoc;
  16.         MSXML2::IXMLDOMNodeListPtr pNodeList;
  17.         MSXML2::IXMLDOMNodePtr pNode, pRoot;
  18.         MSXML2::IXMLDOMNamedNodeMapPtr pAttr;
  19.  
  20.         hr = ::CoInitialize(NULL);
  21.         if (FAILED(hr))
  22.         {
  23.             throw L"failed to com init";
  24.         }
  25.  
  26.         hr = CoCreateInstance(CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, 
  27.             MSXML2::IID_IXMLDOMDocument, (void**)&pDoc);
  28.         if(FAILED(hr))
  29.             throw "failed to create DOM DOC";
  30.  
  31.         VARIANT_BOOL bIsSuccessful;
  32.         BSTR bstr1 = SysAllocString(L"d://b.xml");
  33.         VARIANT v1;
  34.         v1.vt = VT_BSTR;
  35.         v1.bstrVal = bstr1;
  36.  
  37.         /////  载入  xml 文件
  38.         pDoc->load(v1, &bIsSuccessful);
  39.         SysFreeString(bstr1);
  40.  
  41.         /////  获取根节点  ROOT_BASENAME 
  42.         //pRoot = pDoc->firstChild;
  43.         pDoc->get_firstChild(&pRoot);
  44.         /////  输出跟节点名字
  45.         BSTR bstr;
  46.         pRoot->get_nodeName(&bstr);
  47.         cout << (char*)((_bstr_t)bstr) <<endl;
  48.         /////  获取根节点属性  Attr_baseName_1 = "Attr_text_1" Attr_baseName_2 = "Attr_text_2"
  49.         pRoot->get_attributes(&pAttr);
  50.  
  51.         /////  取得属性个数
  52.         long length;
  53.         pAttr->get_length(&length);
  54.         cout << length << endl;
  55.         /////  输出根节点属性
  56.         for(cnt = 0 ; pAttr->nextNode(&pNode), pNode ; ++cnt)
  57.         {
  58.             BSTR baseName;
  59.             pNode->get_baseName(&baseName);
  60.             BSTR text;
  61.             pNode->get_text(&text);
  62.             cout << (char*)((_bstr_t)baseName) << "  " << (char*)((_bstr_t)text) << endl;
  63.         }
  64.         cout << "Attr count " << cnt <<endl;
  65.  
  66.         /////  输出根节点所有儿子
  67.         pRoot->get_childNodes(&pNodeList);
  68.         pNodeList->get_length(&cnt);
  69.         cout << "LENGTH  " << cnt << endl;
  70.         for(cnt = 0; pNodeList->nextNode(&pNode), pNode; ++cnt)
  71.         {
  72.             BSTR text;
  73.             pNode->get_text(&text);
  74.             cout << (char*)((_bstr_t)text) << endl;
  75.         }
  76.         cout << "Node count " << cnt <<endl;
  77.     } 
  78.     catch (string str)
  79.     {
  80.         cout << "Exception : " << str << endl;
  81.     }
  82.     catch (...)
  83.     {
  84.         cout << "Exception Unkonwn/n";
  85.     }
  86.  
  87.     ::CoUninitialize();
  88.  
  89.     cout << "END" <<endl;
  90.  
  91.     return 0;
  92. }
  93.  

xml 文件:

  1. <ROOT_BASENAME Attr_baseName_1 = "Attr_text_1" Attr_baseName_2 = "Attr_text_2">
  2. <FIRST_CHILD>
  3. text_1
  4. </FIRST_CHILD>
  5. <CHILD>
  6. text_2
  7. </CHILD>
  8. <LAST_CHILD>
  9. text_3
</LAST_CHILD>

原创粉丝点击