12

我对如何在 C++ 中读取和写入(更新)一个简单的 .xml 文件进行了大量研究,但我无法为其开发代码。

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

请有人可以帮助编写代码。

执行此操作的示例代码将非常有帮助。

谢谢和最好的问候, 阿达什夏尔马

4

2 回答 2

19

我推荐 MSXML。它可能看起来很复杂,但是当您习惯它时,它会变得又好又容易。
这是一个示例:

输入.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 已成功保存

输出.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/en-us/library/ms765540 (v=vs.85).aspx

希望有人觉得这很有用;)

于 2012-01-25T18:06:22.747 回答
0

Boost 序列化器可以做到这一点,如果你将一个对象传递给它,它会写入一个包含所有类属性的文件(二进制或 xml 甚至是一个简单的文本文件)。

于 2014-01-14T13:52:43.113 回答