|
在写应用程序时,配置文件一般用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. 释放库
最后一定要释放库,否则会出现异常和内存泄漏
|