提高认识孩子

时间:2014-11-06 17:35:44

标签: c++ xml boost boost-propertytree

我的问题与: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.seconda.first

2 个答案:

答案 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)的所有后代,并将它们解释为GenderAge和{{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