使用属性树在boost中进行xml解析

时间:2012-06-14 20:33:13

标签: c++ boost boost-propertytree

我有以下xml文件。它显示了2个驱动器,托架1和托架2的固件版本信息。此时,除了托架1和托架2之外,两个驱动器的一切看起来都相似。但我希望它们具有不同的固件版本。我需要阅读并能够比较托架1和托架2驱动器是否具有相同的固件版本。我正在使用Boost(Red Hat和C ++上的版本1.41属性树)

<Node>
   <Type>XET</Type>
   <Reference>00110232</Reference>
   <Date>02-09-2012</Date>
</Node>
<Node>
   <Type>XET</Type>
   <Reference>000000</Reference>
   <Date>02-09-2012</Date>
</Node>

我的C ++并不是那么棒,关于Boost的文档真的很糟糕。到目前为止,我可以读取xml文件,但我无法搜索并查看固件版本是否相同。没有太多运气,我尝试了几种不同的东西。我真的很感激这方面的一些帮助。

  #include <boost/property_tree/ptree.hpp>
  #include <boost/property_tree/xml_parser.hpp>


  using boost::property_tree::ptree;
  ptree pt;

  // reading file.xml
  read_xml(xmlFilePath, pt, boost::property_tree::xml_parser::trim_whitespace );

  string c ;
  try
  {
    c = pt.get<string>("Node.Reference");
  }
  catch(std::exception const& e)
  {
    std::cout << e.what() << std::endl;
  }

  cout << "value is: " << c << endl;

我解决了一些问题。有人可以告诉我如何获取所有节点?此代码当前找到第一个匹配并打印它,没有别的。如果我知道将有多少节点,我可以使用for循环。其他人有更好的想法,比如使用迭代器?如果是这样,请告诉我如何做到这一点。

1 个答案:

答案 0 :(得分:2)

...
#include <boost/foreach.hpp>
...

namespace PT = boost::property_tree;


...
    read_xml(xmlFilePath, pt, boost::property_tree::xml_parser::trim_whitespace );

    BOOST_FOREACH(const PT::ptree::value_type& node, pt.get_child("Node"))
    {
        PT::ptree& nodeTree = node.second;
        const std::string type      = nodeTree.get<std::string>("Type");
        const std::string reference = nodeTree.get<std::string>("Reference");
        const std::string date      = nodeTree.get<std::string>("Date");
        ...
    }
...