C++ 需要一个非常简单的示例来解析和编写C或C+中的XML文档+;

C++ 需要一个非常简单的示例来解析和编写C或C+中的XML文档+;,c++,c,xml,C++,C,Xml,我从事一个C项目,需要实现一些与XML文件的交互 我需要一个非常简单的例子来解析和编写XML文件 我真的更喜欢一个小的库(比如一个.h文件和一个.c文件),而不是一个需要安装的库 如果有人能告诉我: 如何解析以下示例中的数据 如何生成以下示例中的数据 XML数据: <root> <source name = 'source1' isReadOnly = 'false'> <view name = 'view1' />

我从事一个C项目,需要实现一些与XML文件的交互

我需要一个非常简单的例子来解析和编写XML文件

我真的更喜欢一个小的库(比如一个.h文件和一个.c文件),而不是一个需要安装的库

如果有人能告诉我:

  • 如何解析以下示例中的数据
  • 如何生成以下示例中的数据
XML数据:

<root>
    <source name = 'source1' isReadOnly = 'false'>
        <view name = 'view1' />
        <view name = 'view2' />
    </source>
    <source name = 'source2' isReadOnly = 'true'>
        <view name = 'view1' />
        <view name = 'view2' />
    </source>
</root>

互联网上有很多关于这方面的文章。假设您在windows上,请查找以下示例以供参考:-

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

佛罗里达州
FR
RL
RR
代码如下:

#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;
}
#包括
#包括
#包括
#导入重命名命名空间(_T(“MSXML”))
int main(int argc,char*argv[])
{
HRESULT hr=协同初始化(NULL);
如果(成功(hr))
{
尝试
{
MSXML::IXMLDOMDocument2Ptr xmlDoc;
hr=xmlDoc.CreateInstance(uuuidof(MSXML::DOMDocument60),NULL,CLSCTX_INPROC_SERVER);
//TODO:如果(失败(hr))。。。
if(xmlDoc->load(_T(“input.xml”)!=VARIANT\u TRUE)
{
printf(“无法加载input.xml\n”);
}
其他的
{
printf(“XML已成功加载\n”);
xmlDoc->setProperty(“SelectionLanguage”、“XPath”);
MSXML::IXMLDOMNodeListPtr wheels=xmlDoc->selectNodes(“/Car/wheels/*”);
printf(“汽车有%u个轮子\n”,轮子->Getlength());
MSXML::IXMLDOMNodePtr节点;
node=xmlDoc->createNode(MSXML::node_元素,_T(“引擎”),_T(“”);
节点->文本=_T(“引擎1.0”);
xmlDoc->documentElement->appendChild(节点);
hr=xmlDoc->save(_T(“output.xml”);
如果(成功(hr))
printf(“output.xml已成功保存\n”);
}
}
捕获(_com_error&e)
{
printf(“错误:%ws\n”,例如ErrorMessage());
}
coninitialize();
}
返回0;
}
您也可以查阅以下链接:-

与此相反,如果您在linux平台上,则选择TinyXml:-


我发现pugixml非常易于使用。它是一个小的源文件,可以编译到项目中

示例C++03:

#include <fstream>
#include <iostream>
#include "pugixml.hpp"

int main()
{
    using namespace pugi;

    // Load XML file from fstream

    std::ifstream xml_file("test.xml");

    if(!xml_file)
    {
        std::cerr << "ERROR: opening XML file: " << std::endl;
        return 1;
    }

    xml_document doc;

    xml_parse_result res = doc.load(xml_file);

    if(!res)
    {
        std::cerr << "ERROR: " << res.description() << std::endl;
        return 1;
    }

    // get all children of <root><source>

    xml_object_range<xml_named_node_iterator> sources =
        doc.child("root").children("source");

    // Iterate through <root><source> children

    xml_named_node_iterator s;
    for(s = sources.begin(); s != sources.end(); ++s)
    {
        // get all children named <root><source><view>

        xml_object_range<xml_named_node_iterator> views =
            s->children("view");

        // Iterate through <root><source><view> children

        xml_named_node_iterator v;
        for(v = views.begin(); v != views.end(); ++v)
            std::cout << v->attribute("name").value() << '\n';
    }
}
#include <fstream>
#include <iostream>
#include "pugixml.hpp"

int main()
{
    using namespace pugi;

    std::ifstream xml_file("test.xml");

    if(!xml_file)
    {
        std::cerr << "ERROR: opening XML file: " << std::endl;
        return 1;
    }

    xml_document doc;

    xml_parse_result res = doc.load(xml_file);

    if(!res)
    {
        std::cerr << "ERROR: " << res.description() << std::endl;
        return 1;
    }

    auto sources = doc.child("root").children("source");

    for(auto&& s: sources)
    {
        auto views = s.children("view");

        for(auto&& v: views)
            std::cout << v.attribute("name").value() << '\n';
    }
}
#包括
#包括
#包括“pugixml.hpp”
int main()
{
使用名称空间pugi;
//从fstream加载XML文件
std::ifstreamxml_文件(“test.xml”);
如果(!xml_文件)
{

cerr Boost属性树可以用来解析XML。-我认为它只是头文件。“我真的更喜欢一个小的库(比如一个.h文件和一个.c文件)”您可能有一个很大的误解。正确解析XML是一项复杂得多的任务,可以在单个模块中合理地解决。使用pugixml解析器。它简单易行!为什么要回避使用已被证明能够完成其任务的更大且完善的库?它可能会摧毁孤独天才的神话,但>50%的工作是使用和理解他人的工作。但是,如果您的任务是明确地从头开始设计一个最低限度的XML解析器,那么您可能希望了解使用boost进行正则表达式解析的情况,这也是一个相当沉重的库……我想要一个完善的“标准”库,但是
libxml
expat
在开始使用itI之前需要做大量的准备工作。我需要linux。我将看一看tinyXML。谢谢!您的示例非常好!对我来说非常有用