C++ 在遍历boost::property_树时获取节点的完整xml
在使用boost\u FOREACH进行迭代时,获取boost::property\u树的完整xml文本时遇到问题 Xml文件如下所示:C++ 在遍历boost::property_树时获取节点的完整xml,c++,xml,boost,C++,Xml,Boost,在使用boost\u FOREACH进行迭代时,获取boost::property\u树的完整xml文本时遇到问题 Xml文件如下所示: <foo> <bar param1="val1" param2="val2"> <one>some text</one> <two>some text</two> </bar> <bar param1="val3"
<foo>
<bar param1="val1" param2="val2">
<one>some text</one>
<two>some text</two>
</bar>
<bar param1="val3" param2="val4">
<one>some text</one>
<two>some text</two>
</bar>
</foo>
一些文本
一些文本
一些文本
一些文本
下面是我用来迭代的代码:
ptree pt;
read_xml(input_stream, pt);
BOOST_FOREACH(ptree::value_type const& bar, pt.get_child("foo"))
{
std::ostringstream oss;
write_xml(oss, bar.second);
std::cout << oss.str();
}
ptree-pt;
读取xml(输入流,pt);
BOOST\u FOREACH(ptree::value\u type const&bar,pt.get\u child(“foo”))
{
std::ostringstream oss;
编写xml(oss,bar.second);
很遗憾,如果不简单地将子树序列化为流,我会说这是不可能的。如果你让代码成为SSCCE,我本来可以为你做的。现在,这将需要很多时间(5分钟的样本运行时间超过了展示概念证明所需的时间)@sehe,我添加了可以简单复制的代码&pasted@Apokal似乎有效,但我非常怀疑这是否是最好的方法。希望在你得到真正的答案之前有所帮助。@cv_和__他正是我要做的,因为ptree不是xml库。否则,我会切换到libxml2或pugixml(cv_和_he,sehe非常感谢,你的解决方案非常简单!所以,请有人发布一个答案,这样我就可以接受了,因为我认为不会很快有答案。
<?xml version="1.0" encoding="utf-8"?>
<one>some text</one>
<two>some text</two>
<?xml version="1.0" encoding="utf-8"?>
<bar param1="val1" param2="val2">
<one>some text</one>
<two>some text</two>
</bar>
#include <sstream>
#include <iostream>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/foreach.hpp>
const std::string xml_str =
"<foo>"
"<bar param1=\"val1\" param2=\"val2\">"
"<one>some text</one>"
"<two>some text</two>"
"</bar>"
"<bar param1=\"val3\" param2=\"val4\">"
"<one>more text</one>"
"<two>more text</two>"
"</bar>"
"</foo>";
int main()
{
using namespace boost::property_tree;
using namespace boost::property_tree::xml_parser;
std::istringstream iss(xml_str);
ptree pt;
read_xml(iss, pt);
BOOST_FOREACH(ptree::value_type const& bar, pt.get_child("foo"))
{
std::ostringstream oss;
write_xml(oss, bar.second);
std::cout << oss.str() << std::endl;
}
return 0;
}