因为你特别提到了轻量级,我没看到有提过,我加Boost.PropertyTree。它在底层使用 RapidXML。
它除了解析元素什么都不做,但有时这就足够了。老实说,XML 模式验证、XPath 等。应该被分成不同的库。与提供这种额外覆盖的现有 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;
};
输出:
问题:用 C++ 编写 XML 的好方法是什么?
提问时间:2010 年 6 月 6 日
5 个建议的 XML 提供程序
提供者速度
Boost.PropertyTree 1
快速XML 1
普吉XML 3
TinyXML++ 6
薛西斯 9001
非常简单,您甚至不需要了解 XML!
(忽略我归因于库的速度评级。我编造了它们。)
edit:property_tree 当然支持从 ptree 对象导出 XML。我写了一个阅读XML的例子,因为(1)它是我唯一熟悉的用法,(2)网上的例子很少。