2021-01-14 VC++ 如何使用IXMLDOMDocumentPtr 读取XML文件

19 篇文章 1 订阅

<?xml version="1.0" encoding="utf-8"?>
<LOT>
  <LAYOUT NAME="List">
    <PARAMETER NAME="ID">No.1</PARAMETER>
    <PARAMETER NAME="Number">123456</PARAMETER>
    <PARAMETER NAME="Name">SZ</PARAMETER>
  </LAYOUT>
</LOT>
 

stdafx.h
#import "C:\\Windows\\system32\\msxml6.dll"
using namespace MSXML2;

 

 

    ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

    //a.创建xml文档对象
    MSXML2::IXMLDOMDocumentPtr pDoc; //声明xml文档指针
    HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));  //实例化xml文档对象
    if (SUCCEEDED(hr))
    {
        CComVariant vPath(strfile);//XML文件的绝对路径
        VARIANT_BOOL isSuccessful=pDoc->load(vPath);
        if(isSuccessful!=VARIANT_TRUE)
        {
            AfxMessageBox(_T("load xml wrong!"));
            return;
        }
        else
        {
            MSXML2::IXMLDOMElement *pRootElement=NULL;
            MSXML2::IXMLDOMNode *pRootNode=NULL;

            MSXML2::IXMLDOMNamedNodeMap *pAttrMap=NULL;
            MSXML2::IXMLDOMNode *pAttrNode=NULL;
            MSXML2::IXMLDOMNode *pAddrNode=NULL;

            MSXML2::IXMLDOMNodeList *pChildList=NULL;

            CString strName,strText;
            BSTR bsName,bsText;

            hr=pDoc->get_documentElement(&pRootElement);//获取根结点列表
            if(SUCCEEDED(hr) && (pRootElement!=NULL))
            {
                hr=pRootElement->QueryInterface(IID_IXMLDOMNode,(void**)&pRootNode);
                if(SUCCEEDED(hr))
                {

                    hr=pRootNode->get_firstChild(&pAddrNode);//获取子结点列表
                    if(SUCCEEDED(hr) && (pAddrNode!=NULL))
                    {
                        pAddrNode->get_attributes(&pAttrMap);//属性值

                        long length=0;
                        pAttrMap->get_length(&length);
                        for(int i=0;i<length;i++)
                        {
                            hr=pAttrMap->get_item(i,&pAttrNode);//获取节点
                            if(SUCCEEDED(hr) && (pAttrNode!=NULL))
                            {
                                pAttrNode->get_nodeName(&bsName);//获取节点的名称
                                pAttrNode->get_text(&bsText);//获取结点的值

                                 //NAME="List"
                                strName=bsName;
                                strText=bsText;

                             

                                SysFreeString(bsName);
                                SysFreeString(bsText);
                            }

                            pAddrNode->get_childNodes(&pChildList);//获取子节点列表
                            long n=0;
                            pChildList->get_length(&n);

                            MSXML2::IXMLDOMNode *pChildNode=NULL;
                            MSXML2::IXMLDOMNamedNodeMap *pChildNodeMap=NULL;
                            CString strName1,strText1;
                            BSTR bsName1,bsText1;

                            for(int i=0;i<n;i++)
                            {
                                hr=pChildList->get_item(i,&pChildNode);//获取节点
                                if(SUCCEEDED(hr) && (pChildNode!=NULL))
                                {
                                    pChildNode->get_attributes(&pChildNodeMap);//
                                    long nn=0;
                                    pChildNodeMap->get_length(&nn);
                                    for(int i=0;i<nn;i++)
                                    {
                                        hr=pChildNodeMap->get_item(i,&pAttrNode);//获取节点
                                        if(SUCCEEDED(hr) && (pAttrNode!=NULL))
                                        {
                                            pAttrNode->get_nodeName(&bsName);//获取节点的名称
                                            pAttrNode->get_text(&bsText);//获取结点的值
                                            strName=bsName;
                                            strText=bsText;//ID,Number,Name

                                            pChildNode->get_nodeName(&bsName1);//获取节点的名称
                                            pChildNode->get_text(&bsText1);//获取结点的值
                                            strName1=bsName1;
                                            strText1=bsText1;//No.1,123456,SZ

                                            SysFreeString(bsName1);
                                            SysFreeString(bsText1);

                                            SysFreeString(bsName);
                                            SysFreeString(bsText);
                                        }
                                    }
                                }
                            }

                            pChildNode->Release();
                            pChildNodeMap->Release();

                        }            
                    }
                }
            }
            pRootElement->Release();
            pRootNode->Release();
            pAttrMap->Release();
            pAttrNode->Release();
            pAddrNode->Release();
            pChildList->Release();
        }
        pDoc.Release();
    }
    else
    {
        AfxMessageBox(_T("加载XML错误"));
    }

    ::CoUninitialize();//卸载COM

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值