vc中的xml文件读取操作

读取xml

1、在stdafx.h中引用如下
#include "TLH/msxml4.tlh" using namespace MSXML2
2、在app文件中注意初始化com
#if _WIN32_WINNT >= 0x0400
 HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
#else
 HRESULT hRes = CoInitialize(NULL);
#endif
注意在ExitInstance函数中写在初始化的com
CoUninitialize();

3、定义document变量
MSXML2::IXMLDOMDocumentPtr m_pXMLDoc;


//读取XML信息
bool ReadXML(CString strPath)
{
 bool bRgs = false;
 try
 {  
  if (strPath.IsEmpty())
   return false;
  _bstr_t strURL(strPath);        
  HRESULT hr = m_pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
    m_pXMLDoc->async = VARIANT_FALSE; // default - true,
  m_pXMLDoc->validateOnParse = VARIANT_FALSE;
  hr = m_pXMLDoc->load(strURL);
  if(hr!=VARIANT_TRUE)
  {
   MSXML2::IXMLDOMParseErrorPtr  pError;
   pError = m_pXMLDoc->parseError;
   _bstr_t parseError =_bstr_t("At line ")+ _bstr_t(pError->Getline()) + _bstr_t("/n")+ _bstr_t(pError->Getreason());
   ::MessageBox(NULL,parseError, "Parse Error",MB_OK);
   bRgs = false;  
  }
  else
   bRgs = true;  
 }
 catch(_com_error &e)
 {
  _bstr_t bt = e.Description();
  ::MessageBox(NULL,bt,"Catch Error",MB_OK);
 }
 return bRgs;

//读取xml文件的节点值:
//xmleg.
//<?xml version="1.0" encoding="GB2312"?>
//<config>
//<childnode1>name="admin",birthday="1928-1-2",sex="male",addr="Hongkong"</childnode1>
//</config>
CString GetNodeContent(_bstr_t bstrName)//bstrName="/config/childnode1"
{
CString strRgs(_T(""));
 try
 {
  
  MSXML2::IXMLDOMNodePtr pNode = m_pXMLDoc->selectSingleNode(bstrName);
  _bstr_t bt = pNode->Gettext();
  strRgs = bt.copy();
  
 }
 catch(...)
 {
 }
 return strRgs;
}

//读取xml文件的属性值:
//xml 文件
//eg.
//<?xml version="1.0" encoding="GB2312"?>
//<config>
//<childnode1 name="admin",birthday="1928-1-2",sex="male",addr="Hongkong"/>
//</config>
//方法一:
CString GetNodeAttributes(_bstr_t bstrName,CStringArray& arrAttributeName,CStringArray& arrAttributeValue)//bstrName="/config/childnode1"
{
 arrAttribute.RemoveAll();
 try
 {
  
  MSXML2::IXMLDOMNodePtr pNode = m_pXMLDoc->selectSingleNode(bstrName);
  MSXML2::IXMLDOMNamedNodeMapPtr nameattr = pNode->Getattributes();
  
  int iLength = nameattr->Getlength();
  for (int j = 0; j<iLength; j++)
  {
   MSXML2::IXMLDOMNodePtr pN = nameattr->Getitem(j);
   MSXML2::DOMNodeType pNodeType = pNode->GetnodeType();
   if (pNodeType == NODE_ELEMENT)
   {
    CString strTmp;
    _bstr_t kt ;
    kt = pN->GetnodeName();
    strTmp = kt.copy();
    arrAttributeName.Add(strTmp);
    kt = pN->Gettext();
    CString strTmp = kt.copy();
    arrAttribute.Add(strTmp);
   }
  }
 }
 catch(...)
 {
 }
 return strRgs;
}
//方法二
CString GetNodeAttributes(_bstr_t bstrName)//bstrName="/config/childnode1"
{
 arrAttribute.RemoveAll();
 try
 {
  
  MSXML2::IXMLDOMNodePtr pNode = m_pXMLDoc->selectSingleNode(bstrName);
  MSXML2::IXMLDOMElementPtr pElement = pNode;
  _variant_t vt;
  vt = pElement->getAttribute(_bstr_t("name"));
  vt = pElement->getAttribute(_bstr_t("birthday"));
  vt = pElement->getAttribute(_bstr_t("sex"));
  vt = pElement->getAttribute(_bstr_t("addr"));
 }
 catch(...)
 {
 }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值