有很多库可以解析XML,但似乎没有很多好的(?)方法可以用C ++编写XML。
到目前为止我一直在使用的库:
无论如何,为了说明问题,我编写了一个PHP脚本来完成我计划用C ++做的事情:http://codepad.org/RyhQSgcm
我真的很感激任何帮助!
答案 0 :(得分:2)
Xerces-C ++是一个用C ++的可移植子集编写的验证XML解析器。 Xerces-C ++使您的应用程序能够轻松读取和编写 XML数据。提供了一个共享库,用于使用DOM,SAX和SAX2 API解析,生成,操作和验证XML文档。有关使用Xerces-C ++进行编程的介绍,请参阅编程指南。
The POCO project还有一个允许您生成XML的XMLWriter。
答案 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的案例。