在C++中读写XML文件

13

我在研究如何在C ++中读取和编写(更新)一个简单的 .xml 文件,但是我无法开发出相应的代码。

我安装了 xerces-c 库,我认为需要使用 DOM 或 SAX2 解析器来读取它。

请有经验的人帮助编写这段代码。

提供一份示例代码将非常有帮助。

谢谢 & 最好的问候, Adarsh Sharma


如果您不介意尝试其他工具,可以尝试使用vtd-xml。它更好、更易用,而且速度更快。 - vtd-xml-author
@Raphael,同意,这些示例非常全面,覆盖了所有原帖的要求。 - Ralf
2个回答

20
我推荐使用MSXML。虽然看起来有点复杂,但是当你熟悉它之后,就会发现它非常好用和简单。
这里有一个样例:

input.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Car>
    <Wheels>
        <Wheel1>FL</Wheel1>
        <Wheel2>FR</Wheel2>
        <Wheel3>RL</Wheel3>
        <Wheel4>RR</Wheel4>
    </Wheels>
</Car>

代码:

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#import <msxml6.dll> rename_namespace(_T("MSXML"))

int main(int argc, char* argv[]) {
    HRESULT hr = CoInitialize(NULL); 
    if (SUCCEEDED(hr)) {
        try {
            MSXML::IXMLDOMDocument2Ptr xmlDoc;
            hr = xmlDoc.CreateInstance(__uuidof(MSXML::DOMDocument60),
                                       NULL, CLSCTX_INPROC_SERVER);
            // TODO: if (FAILED(hr))...

            if (xmlDoc->load(_T("input.xml")) != VARIANT_TRUE) {
                printf("Unable to load input.xml\n");
            } else {
                printf("XML was successfully loaded\n");

                xmlDoc->setProperty("SelectionLanguage", "XPath");
                MSXML::IXMLDOMNodeListPtr wheels = xmlDoc->selectNodes("/Car/Wheels/*");
                printf("Car has %u wheels\n", wheels->Getlength());

                MSXML::IXMLDOMNodePtr node;
                node = xmlDoc->createNode(MSXML::NODE_ELEMENT, _T("Engine"), _T(""));
                node->text = _T("Engine 1.0");
                xmlDoc->documentElement->appendChild(node);
                hr = xmlDoc->save(_T("output.xml"));
                if (SUCCEEDED(hr))
                    printf("output.xml successfully saved\n");
            }
        } catch (_com_error &e) {
            printf("ERROR: %ws\n", e.ErrorMessage());
        }
        CoUninitialize();
    }
    return 0;
}

输出:

XML已成功加载

汽车有4个轮子

output.xml 成功保存

output.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Car>
    <Wheels>
        <WheelLF>1</WheelLF>
        <WheelRF>2</WheelRF>
        <WheelLR>3</WheelLR>
        <WheelRR>4</WheelRR>
    </Wheels>
    <Engine>Engine 1.0</Engine></Car>

您可以在这里找到所需的一切:
http://msdn.microsoft.com/zh-cn/library/ms765540(v=vs.85).aspx

希望对某些人有所帮助 ;)


我需要一个Mac OSX的解决方案。你能帮忙吗? - Md Mahbubur Rahman
@MahbuburRAaman:很抱歉回复晚了,我不能帮你解决这个问题,因为我没有使用Mac OSX的经验。但是我相信你已经找到了其他的解决方案 :) - LihO
你忘记了头文件#include <comdef.h>。 - Bob White

0
Boost序列化器可以解决这个问题,如果你将一个对象传递给它,它会将所有类属性写入文件(二进制、XML甚至是简单文本文件)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接