我的问题与:boost
有关某些提升代码正常工作以发现某个节点有子节点,但如果一个节点有另外两个节点则无法识别这些节点。
这是递归调用,能够读取所有树节点,然后将值的副本应用于谷歌协议缓冲区
void ReadXML(iptree& tree, string doc)
{
const GPF* gpf= pMessage->GetGPF();
for(int i = 0 ; i < gpf->field_count(); ++i)
{
string fieldName = GetName(i);
boost::optional< iptree & > chl = pt.get_child_optional(fieldName);
if(chl) {
for( auto a : *chl ){
boost::property_tree::iptree subtree = (boost::property_tree::iptree) a.second ;
assignDoc(doc);
ReadXML(subtree, doc);
}
}
}
}
XML文件
<?xml version="1.0" encoding="utf-8"?>
<nodeA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<nodeA.1>This is the Adresse</nodeA.1>
<nodeA.2>
<node1>
<node1.1>
<node1.1.1>Female</node1.1.1>
<node1.1.2>23</node1.1.2>
<node1.1.3>Engineer</node1.1.3>
</node1.1>
<node1.1>
<node1.2.1>Female</node1.2.1>
<node1.2.2>35</node1.2.2>
<node1.2.3>Doctors</node1.2.3>
</node1.1>
</node1>
</nodeA.2>
<nodeA.3>Car 1</nodeA.3>
</nodeA>
我的问题是node1
未被识别为有孩子。我不知道是不是因为有两个同名的子节点。
请注意,XML文件可能会从一个客户端更改为另一个客户端。我可能有不同的节点。
我是否必须使用a.second
或a.first
?
答案 0 :(得分:0)
下面
boost::optional< iptree & > chl = pt.get_child_optional(fieldName);
您明确搜索具有给定名称的孩子。在递归期间,此名称似乎永远不会发生变化。在每个级别上,您都会寻找具有相同名称的孩子。
答案 1 :(得分:0)
我认为你可以/应该从更高层面看待这个问题。
Boost Property Tree使用RapidXML。 PugiXML是一个类似但更现代的库,也可以在仅标题模式下使用。使用PugiXML,您可以写:
pugi::xml_document doc;
doc.load(iss);
for (auto& node : doc.select_nodes("*/descendant::*[count(*)=3]/*[count(*)=0]/.."))
{
auto values = node.node().select_nodes("*/text()");
std::cout << "Gender " << values[0].node().value() << "\n";
std::cout << "Age " << values[1].node().value() << "\n";
std::cout << "Job Title " << values[2].node().value() << "\n";
}
它选择三个 leaf 子节点的根节点(nodeA
)的所有后代,并将它们解释为Gender
,Age
和{{1 }}。它打印:
Job Title
我希望你会发现这种建设性的。
在我的系统上构建,只需:
Gender Female
Age 23
Job Title Engineer
Gender Female
Age 35
Job Title Doctors
sudo apt-get install libpugixml-dev
g++ -std=c++11 demo.cpp -lpugixml -o demo
./demo
:
demo.cpp