zoukankan      html  css  js  c++  java
  • MSXML 解析XML文件

    <msglist>
    <data>
     <Name>changjiang</Name>
     <ID>1</ID>
    </data>
    <data>
     <Name>wang</Name>
     <ID>2</ID>
    </data>
    </msglist>

    1.先要#Import<MSXML6.dll>

    2.要添加命名空间

    3.创建组件两种方式CreateInstance和CoCreateInstance,有的时候直接添加IID时候不能编译通过添加到 __uuidof(MSXML2::DOMDocument60)可以编过

    4.设置相关属性 pXmlDoc->put_async(VARIANT_FALSE);
       pXmlDoc->put_validateOnParse(VARIANT_FALSE);
       pXmlDoc->put_resolveExternals(VARIANT_FALSE);

    5.打开xml文件,在网上找的大部分是直接打开xml文件,我的编译不通过可能是用的msxml版本不同吧,

       VariantInit( &vXMLSrc );
       vXMLSrc.vt = VT_BSTR;
       vXMLSrc.bstrVal = SysAllocString(L"test.xml");

    设置打开相关文件

    6.这样打开的指针式文件的指针我理解的其实每一个《》中的就是一个NODE,这是用文件指针pXmlDoc遍历data node是不可见的

    所以要先指定<msglist> node 用selectSingleNode单个node 取得msglist node的指针 然后用selectNodes取得List然后遍历

    LIst中的各个属性得到值。

    7.这里的请求空间都是传的单*的地址,是在函数内部实现空间的申请的,所以当该指针不用的时候需要释放,调用Release方法。

    8.<data Name=“changjiang”, ID = “1”>这种是通过get_attributes获取值的。

    #include "stdafx.h"
    #include <windows.h>
    using namespace MSXML2;
    int main(int argc, char* argv[])
    {
       VARIANT vXMLSrc;
       CoInitialize(NULL); 
       IXMLDOMDocumentPtr pXmlDoc;
       IXMLDOMElement  *iXMLElm = NULL;
       IXMLDOMNodeList *iXMLChild   = NULL;
       IXMLDOMNode*    iXMLItem    = NULL;
       IXMLDOMNode*    iXMLTrmpItem    = NULL;
       IXMLDOMNode*  pAttrTmp=NULL;
       IXMLDOMNamedNodeMap *pAttrMap=NULL;
       HRESULT hr = pXmlDoc.CreateInstance( __uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER);

       pXmlDoc->put_async(VARIANT_FALSE);
       pXmlDoc->put_validateOnParse(VARIANT_FALSE);
       pXmlDoc->put_resolveExternals(VARIANT_FALSE);
       VARIANT_BOOL result;
       VariantInit( &vXMLSrc );
       vXMLSrc.vt = VT_BSTR;
       vXMLSrc.bstrVal = SysAllocString(L"test.xml");
     if(pXmlDoc->load(vXMLSrc,&result) != VARIANT_TRUE)
     {

      pXmlDoc->selectSingleNode(L"msglist",&iXMLItem);
      iXMLItem->selectNodes(L"data",&iXMLChild);
    //  wchar_t* bStr = NULL;
    //  iXMLItem->get_text(&bStr);
     
      long lLength = 0;
      iXMLChild->get_length(&lLength);
      for (int x=0;x<lLength;x++)
      {
       iXMLChild->get_item(x,&iXMLTrmpItem);

    //   iXMLTrmpItem->get_attributes(&pAttrMap);
    //   pAttrMap->getNamedItem(L"Name",&pAttrTmp);
       wchar_t* bStr = NULL;
       iXMLTrmpItem->selectSingleNode(L"Name",&iXMLItem);
       iXMLItem->get_text(&bStr);

       iXMLItem->Release();
       iXMLItem = NULL;
       iXMLTrmpItem->selectSingleNode(L"ID",&iXMLItem);
       iXMLItem->get_text(&bStr);

    //   pAttrTmp->get_text(&bStr);
    //   pAttrMap->getNamedItem(L"ID",&pAttrTmp);
    //   bStr = NULL;
    //   pAttrTmp->get_text(&bStr);
      
      }

            
       
     return 0;
    }

  • 相关阅读:
    为开源项目 go-gin-api 增加后台任务模块
    将多行数据以',' 进行分隔
    syslog中的“(CRON)信息(未安装MTA,丢弃输出)”错误,crontab定时任务失效
    为什么我不推荐大家去外包公司?
    Linux永久修改系统时间
    云数据库 Redis 暂时不支持外网访问
    Nginx中worker connections问题的解决方法 大量用户502
    入手
    nginx 之$proxy_host|$host|$http_host区别
    grpc-golang入门
  • 原文地址:https://www.cnblogs.com/Neu400753645/p/2758270.html
Copyright © 2011-2022 走看看