本文背景:
在写应用程序时,配置文件一般用XML文件作为文件存储格式,那么就需要一个读取配置的方法,本文在Visual Studio.Net 2003中,用MSXML2库实现了DOM模型读取XML的模块,总结了一些主要的过程,仅供参考。
本文目的:
利用MSXML2库读取XML的过程Demo。
本文内容:
1. 导入库
#include "COMTemplates.h"
#import "msxml2.dll"
using namespace std;
以上将MSXML2库包含进工程中。
2. 初始化
定义DOM模型中的文档对象
CComPtr m_spDoc;
HRESULT hr = S_OK;
初始化库对象
SafeCreateInstance(hr, m_spDoc, __uuidof(MSXML2::DOMDocument26));
char *pPath="TSCprofiles.xml";
CComBSTR Path = CComBSTR(pPath);
将XML文件导入内存中的文档对象
VARIANT_BOOL success=m_spDoc->load(CComVariant(Path));
3. 获取结点实例——已知结点名字
一般用于获取根结点,因为不会出现几个同名根结点。CComPtr spNode;
CComPtr spChildren;
获取文档中的所有一级结点(结点名= RequiredNodeName)
m_spDoc->documentElement->get_childNodes(&spChildren);
long NumChildren = 0;
spChildren->get_length(&NumChildren);
CComBSTR NodeName;
int i = 0;
spChildren->item[i]->get_nodeName(&NodeName);
遍历结点名字
while ((NodeName != RequiredNodeName) && (++i < NumChildren))
{
NodeName.Empty();
spChildren->item[i]->get_nodeName(&NodeName);
}
if (i < NumChildren)
{
spNode = spChildren->item[i];
}
return spNode;
4. 读取子结点——已知父结点及子结点名
在获得根结点后,一般会有若干子结点,根据自结点名字获得子结点的方法很有用。
CTSCInstallHelperDlg::getChildNodeByName(CComPtr spParentNode, BSTR nodeName,CComPtr& spChildNode)
{
ASSERT(spParentNode!=NULL);
CComPtr spChildrens;
spParentNode->get_childNodes(&spChildrens);
long count=0;
spChildrens->get_length(&count);
for(int len=0;len
{
spChildrens->get_item(len,&spChildNode);
BSTR name;
spChildNode->get_nodeName(&name);
if(wcscmp(name,nodeName)==0)
return;
spChildNode=NULL;
}
spChildNode=NULL;
}
5. 读取属性值——已知结点及属性名
属性其实相当于一个子结点。
BSTR CTSCInstallHelperDlg::getAttributeByName(CComPtr spEnumNode, BSTR attrName)
{
CComPtr attrs;
spEnumNode->get_attributes(&attrs);
在子结点属性列表中取对应属性
MSXML2::IXMLDOMNodePtr attr=attrs->getNamedItem(attrName);
返回属性值
return attr->text;
}
6. 释放库
最后一定要释放库,否则会出现异常和内存泄漏
m_spDoc->Release()
----文章结束----