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