C++使用msxml解析XML文件

C++使用msxml解析XML文件

问题描述:

 <?xml version="1.0" encoding="utf-8"?>
<AUTOSAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://autosar.org/schema/r4.0"  xsi:schemaLocation="http://autosar.org/schema/r4.0 AUTOSAR_00042.xsd">
    <ADMIN-DATA>
        <LANGUAGE>EN</LANGUAGE>
        <USED-LANGUAGES>
            <L-10 L="EN"/>
        </USED-LANGUAGES>
    </ADMIN-DATA>
    <AR-PACKAGES>
        <AR-PACKAGE>
            <SHORT-NAME>DataTypes</SHORT-NAME>
            <AR-PACKAGES>
                <AR-PACKAGE>
                    <SHORT-NAME>BaseTypes</SHORT-NAME>
                    <ELEMENTS>
                        <SW-BASE-TYPE>
                            <SHORT-NAME>boolean</SHORT-NAME>
                            <CATEGORY>FIXED_LENGTH</CATEGORY>
                            <BASE-TYPE-SIZE>8</BASE-TYPE-SIZE>
                            <MAX-BASE-TYPE-SIZE>0</MAX-BASE-TYPE-SIZE>
                            <BASE-TYPE-ENCODING>NONE</BASE-TYPE-ENCODING>
                            <MEM-ALIGNMENT>0</MEM-ALIGNMENT>
                            <NATIVE-DECLARATION>boolean</NATIVE-DECLARATION>
                        </SW-BASE-TYPE>
                        <SW-BASE-TYPE>
                            <SHORT-NAME>uint8</SHORT-NAME>
                            <CATEGORY>FIXED_LENGTH</CATEGORY>
                            <BASE-TYPE-SIZE>8</BASE-TYPE-SIZE>
                            <MAX-BASE-TYPE-SIZE>0</MAX-BASE-TYPE-SIZE>
                            <BASE-TYPE-ENCODING>NONE</BASE-TYPE-ENCODING>
                            <MEM-ALIGNMENT>0</MEM-ALIGNMENT>
                            <NATIVE-DECLARATION>uint8</NATIVE-DECLARATION>
                        </SW-BASE-TYPE>
                        <SW-BASE-TYPE>
                            <SHORT-NAME>uint16</SHORT-NAME>
                            <CATEGORY>FIXED_LENGTH</CATEGORY>
                            <BASE-TYPE-SIZE>16</BASE-TYPE-SIZE>
                            <MAX-BASE-TYPE-SIZE>0</MAX-BASE-TYPE-SIZE>
                            <BASE-TYPE-ENCODING>NONE</BASE-TYPE-ENCODING>
                            <MEM-ALIGNMENT>0</MEM-ALIGNMENT>
                            <NATIVE-DECLARATION>uint16</NATIVE-DECLARATION>
                        </SW-BASE-TYPE>
                        <SW-BASE-TYPE>
                            <SHORT-NAME>uint32</SHORT-NAME>
                            <CATEGORY>FIXED_LENGTH</CATEGORY>
                            <BASE-TYPE-SIZE>32</BASE-TYPE-SIZE>
                            <MAX-BASE-TYPE-SIZE>0</MAX-BASE-TYPE-SIZE>
                            <BASE-TYPE-ENCODING>NONE</BASE-TYPE-ENCODING>
                            <MEM-ALIGNMENT>0</MEM-ALIGNMENT>
                            <NATIVE-DECLARATION>uint32</NATIVE-DECLARATION>
                        </SW-BASE-TYPE>
                    </ELEMENTS>
                </AR-PACKAGE>
            </AR-PACKAGES>
        </AR-PACKAGE>
    </AR-PACKAGES>
</AUTOSAR>

如上所示,一段xml文件,现在想要用msxml解析这段XML文件,

现在想要获取ELEMENTS下,所有SW-BASE-TYPE内所有子节点的内容集合,

msxml库简单介绍

#include "stdafx.h"
#include

using namespace std;

#import
using namespace MSXML2;

int ReadXMLFile()
{
CoInitialize(NULL);

char *xmlFile = "student.xml";
MSXML2::IXMLDOMDocumentPtr pdoc = NULL;
MSXML2::IXMLDOMNodeListPtr pnodeList = NULL;
MSXML2::IXMLDOMElementPtr prootElement = NULL;
MSXML2::IXMLDOMNodePtr pnode = NULL;
MSXML2::IXMLDOMNamedNodeMapPtr pattrList = NULL;
MSXML2::IXMLDOMAttributePtr pattrNode = NULL;

HRESULT hr = pdoc.CreateInstance(__uuidof(DOMDocument60));
if(FAILED(hr))
{
printf("无法创建DOMDocument60对象!");
return EXIT_FAILURE;
}

VARIANT_BOOL xmlLoad = pdoc->load((_variant_t)xmlFile);
//加载失败
if(!xmlLoad)
{
printf("加载%s失败!\n", xmlFile);
return EXIT_FAILURE;
}

prootElement = pdoc->GetdocumentElement();
cout<< (char*)prootElement->GetnodeName() <<endl;

CoUninitialize();

return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
ReadXMLFile();
getchar();
return 0;
}

你可以先用msxml拿到ELEMENTS。然后再循环一下。