在C ++中编写XML的好方法是什么?

时间:2010-06-06 23:28:28

标签: c++ xml

有很多库可以解析XML,但似乎没有很多好的(?)方法可以用C ++编写XML。

到目前为止我一直在使用的库:

  • PugiXML:非常轻量级,非常直接的API,但它似乎缺乏编写XML的方法(或者我还没有找到它)
  • RapidXML:我对RapidXML没有多少经验;但它看起来确实不错。
  • TinyXML:我觉得很奇怪STL TinyXML需要在TinyXML中明确“启用” - 我的意思是,如果你的编译器不支持STL,那就更好了!

无论如何,为了说明问题,我编写了一个PHP脚本来完成我计划用C ++做的事情:http://codepad.org/RyhQSgcm

我真的很感激任何帮助!

7 个答案:

答案 0 :(得分:2)

Xerces DOM Parser

Xerces-C ++是一个用C ++的可移植子集编写的验证XML解析器。 Xerces-C ++使您的应用程序能够轻松读取和编写 XML数据。提供了一个共享库,用于使用DOM,SAX和SAX2 API解析,生成,操作和验证XML文档。有关使用Xerces-C ++进行编程的介绍,请参阅编程指南。

The POCO project还有一个允许您生成XML的XMLWriter。

当然总有this existing StackOverflow post

答案 1 :(得分:2)

我使用std :: ostream :: operator()和一个简单的函数,如果需要,它将引用一个字符串。 花时间和内存构建一个DOM,当你想要做的就是将现有数据发送到XML似乎需要很长时间......

答案 2 :(得分:2)

如果你在C ++工作,你应该再次考虑ticpp。设置和输出(简单)有效的xml并不需要太多,使用您期望从处理流的任何东西的确切语法。

This link显示了如何使用该库,所包含的构建注释足以完成所有设置。

答案 3 :(得分:2)

因为您特别提到了轻量级,我还没有看到它,我会添加Boost.PropertyTree。它使用RapidXML。

它除了解析元素之外什么都不做,但有时这就足够了。老实说,XML模式验证,XPath和co。值得分成独立的图书馆。将现有的C ++合并纳入提供额外覆盖范围可能并不困难。

示例XML文件/字符串:

std::string xml_providers =
    "<question>"
    "   <title>What’s a good way to write XML in C++?</title>"
    "   <date>2010/6/6</date>"
    "</question>"
    "<providers>"
    "   <provider speed=\"1\">Boost.PropertyTree</provider>"
    "   <provider speed=\"6\">TinyXML++</provider>"
    "   <provider speed=\"3\">PugiXML</provider>"
    "   <provider speed=\"9001\">Xerxes</provider>"
    "   <provider speed=\"1\">RapidXML</provider>"
    "</providers>";

boost::property_tree会像这样使用:

using boost::property_tree::xml_parser::read_xml;
using boost::property_tree::ptree;
using boost::gregorian::from_string;
using boost::gregorian::date;

ptree doc;
std::istringstream iss(xml_providers);
xml_parser::read_xml(iss, doc);

std::string title = doc.get<std::string>("question.title");
date when = from_string(doc.get<std::string>("question.date"));
ptree providers = doc.get_child("providers");
std::size_t size = std::distance(providers.begin(), providers.end());

std::cout << "Question: " << title << std::endl;
std::cout << "Asked on: " << when << std::endl;
std::cout << size << " suggested XML providers" << std::endl << std::endl;
std::cout << std::left << std::setw(25)
    << "Provider" << "Speed" << std::endl;

providers.sort(sort_by_speed);
std::for_each(providers.begin(), providers.end(), send_to_cout);

两个辅助函数:

auto sort_by_speed = [](ptree::value_type& a, ptree::value_type& b) -> bool {
    int a_speed = a.second.get<int>("<xmlattr>.speed");
    int b_speed = b.second.get<int>("<xmlattr>.speed");
    return a_speed < b_speed;
};
auto send_to_cout = [](ptree::value_type& provider) {
    std::cout << std::left << std::setw(25)
        << provider.second.get_value<std::string>()
        << provider.second.get<int>("<xmlattr>.speed") << std::endl;
};

输出:

Question: WhatÆs a good way to write XML in C++?
Asked on: 2010-Jun-06
5 suggested XML providers

Provider                 Speed
Boost.PropertyTree       1
RapidXML                 1
PugiXML                  3
TinyXML++                6
Xerxes                   9001

您甚至不需要了解XML就太容易了!

(忽略我归因于图书馆的速度等级。我制作了它们。)

edit:property_tree当然支持从ptree对象导出XML。我写了一个阅读XML的例子,因为(1)它是我熟悉的唯一用法,(2)网上的例子很少。

答案 4 :(得分:1)

评论中已经提到过,但我将再次提到TinyXML。在我使用它的〜7年里,我从来没有遇到任何问题。

API并不是真正惯用的C ++(我自己从未真正对“ticpp”封装器感到困扰)但它运行良好,速度很快,如果您的真的,它很容易自己封装不喜欢API。

答案 5 :(得分:1)

我建议CodeSynthesis xsd编译器和C ++树映射。

答案 6 :(得分:0)

大多数人都讨厌这个答案,但我习惯于编写XML longhand(在C ++中这将使用ostream)并使用第三方库来读取XML。

我还没有阅读和修改XML的案例。