如何用MSXML2操作XML配置文件

本文背景:
在写应用程序时,配置文件一般用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()

 ----文章结束----


 

你可能感兴趣的:(XML)