20070116   vc xml
WWW.SHENGFANG.ORG

微软提供 MSXML.DLL 接口可以解析

头文件:
#import "msxml3.dll"
using namespace MSXML2;
inline void TESTHR(HRESULT _hr) &leftsign; if FAILED(_hr) throw(_hr); &rightsign;

实现文件:
TESTHR(CoInitialize(NULL)); //初始化COM 环境

IXMLDOMNodePtr CClient::ReadXMLFile(const char *name)
&leftsign;
    // 我们首先应该先创建一个Document对象如果创建成功,那么我们就会得到一个XMLDOMDocument对象实例。
    MSXML::IXMLDOMDocumentPtr docPtr = NULL;

    try
    &leftsign;
        //init
        docPtr.CreateInstance("msxml2.domdocument");
     
        // load a document
        _variant_t varXml(name);
        _variant_t varOut((bool)TRUE);
        varOut = docPtr->load(varXml);
        if ((bool)varOut == FALSE)
            throw(0);
       
        return docPtr;
    &rightsign;
    catch(…)
    &leftsign;
        IXMLDOMParseError *pIParseError = NULL;

        docPtr->get_parseError(&pIParseError);
        m_strError = (char *)pIParseError->srcText;
    &rightsign;
   
    return NULL;
&rightsign;

……
IXMLDOMNodePtr attr; // 创建Element对象
if ( ptr->nodeType == NODE_ELEMENT ) // 节点类型
&leftsign;
    ptr->nodeName; // 节点名
    ptr->childNodes->length; // 子节点个数
    ptr->childNodes->item[i]->attributes->length; // 子节点第i项有几项属性
    ptr->childNodes->item[i]->attributes->get_item(j, &attr); // 子节点第i项的第j个属性
    attr->nodeName; // 上面属性的属性名称
    attr->text; // 上面属性的属性值
    ……
&rightsign;

……
IXMLDOMNodePtr ptr;
ptr = ptr->parentNode->selectSingleNode("template[@lead_pri_form=\'AUTO_3X4\']"); // 定位节点
……

首先确保你的计算机上有MSXML,看一下C:\\WINDOWS\\system32下是否有 msxml?.dll 。

建一个console模式的程序,输入

////// msxml_test.cpp 
////// use MFC in a shared dll
#include <iostream>
#include <cmath>
#include <string>
#import <msxml4.dll>
#include <msxml.h>
using namespace std;
using namespace MSXML2;

int main()
&leftsign;
 
 cout << "BEGIN" <<endl;

 HRESULT hr;
 long cnt;
 try
 &leftsign;

  hr = ::CoInitialize(NULL);
 
  IXMLDOMDocumentPtr pDoc;  //// xml 文档    智能指针
  IXMLDOMNodeListPtr pNodeList;   //// 节点list
  IXMLDOMNodePtr pNode,pRoot;  //// 节点
  IXMLDOMNamedNodeMapPtr pAttr; //// 属性

  if(FAILED(hr))
   throw "failed to com init";

  ///// 创建实例
  hr = pDoc.CreateInstance(__uuidof(DOMDocument40));
  if(FAILED(hr))
   throw "failed to create DOM DOC";

  ///// 载入 xml文件
  pDoc->load("d:\\\\test.xml");

  ///// 获取根节点 ROOT_BASENAME
  pRoot = pDoc->firstChild;
  ///// 输出跟节点名字
  cout << (char*)pRoot->nodeName <<endl;
  ///// 获取根节点属性 Attr_baseName_1 = "Attr_text_1" Attr_baseName_2 = "Attr_text_2"
  pRoot->get_attributes(&pAttr);

  ///// 取得属性个数
  cout << pAttr->length << endl;
  ///// 输出根节点属性
  for(cnt = 0 ; (pNode = pAttr->nextNode()) ; ++cnt)
  &leftsign;
   cout << (char*)pNode->baseName << "  " << (char*)((_bstr_t)pNode->text) << endl;
  &rightsign;
  cout << "Attr count " << cnt <<endl;

  ///// 输出根节点所有儿子
  pRoot->get_childNodes(&pNodeList);
  pNodeList->get_length(&cnt);
  cout << "LENGTH  " << cnt << endl;
  for(cnt = 0 ; (pNode = pNodeList->nextNode()) ; ++cnt)
  &leftsign;
   cout << (char*)((_bstr_t)pNode->text) << endl;
  &rightsign;
  cout << "Node count " << cnt <<endl;
 &rightsign;
 catch (string str)
 &leftsign;
  cout << "Exception : " << str << endl;
 &rightsign;
 catch (…)
 &leftsign;
  cout << "Exception Unkonwn\\n";
 &rightsign;

 ::CoUninitialize();

 cout << "END" <<endl;

 return 0;
&rightsign;
///////////////////////

再在D:盘下见文件 test.xml,输入内容

<ROOT_BASENAME Attr_baseName_1 = "Attr_text_1" Attr_baseName_2 = "Attr_text_2">
<FIRST_CHILD>
text
</FIRST_CHILD>
<CHILD>
text
</CHILD>
<LAST_CHILD>
text
</LAST_CHILD>
</ROOT_BASENAME>

运行即可。

历史博文

标签:,
六月 20, 2007 at 12:30 下午 by yippee 1,029 次
Category: Info
Tags: ,