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>
运行即可。
历史博文
- 20081021 ruby pthon ide - 2009
- 20070926 linux select - 2008
- 0228 cdecl C2664 msdn - 2006
- 系统无法启动,缺少BOOT.INI HAL.DLL - 2005