如何用MSXML2操作XML配置文件

2008-05-05 10:39:57.0     推荐:0    收藏:0    评论:0     来源:e800.net频道
在写应用程序时,配置文件一般用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. 释放库

  最后一定要释放库,否则会出现异常和内存泄漏

您可以针对本文进行:[评论]  [收藏]  [推荐]  
  • 共有0条评论  点击查看更多评论
  • 网友评论仅供网友表达个人看法,并不表明e800同意其观点或证实其描述
我想发表评论:
用户名密码
  • 匿名发表
    验证码: