使用 Boost 在 XML 中查找密钥

Posted

技术标签:

【中文标题】使用 Boost 在 XML 中查找密钥【英文标题】:Find Key in XML with Boost 【发布时间】:2014-11-05 18:51:30 【问题描述】:

我第一次在我们拥有的旧代码库中使用 boost

iptree children = pt.get_child(fieldName);
for (const auto& kv : children)  
    boost::property_tree::iptree subtree = (boost::property_tree::iptree) kv.second ;
//Recursive call

我的问题有时是 fieldName 在 XML 文件中不存在,我有一个异常

我试过了:

boost::property_tree::iptree::assoc_iterator it = pt.find(fieldName);

但我不知道如何使用我无法使用的它:if (it != null)

如有任何帮助,我们将不胜感激

我正在使用 VS 2012

如果它非常复杂,还有其他方法可以读取带有嵌套节点的 XML 吗?我从 3 天开始就一直在努力

这是一个 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.2>
        <node1.2.1>Female</node1.2.1>
        <node1.2.2>35</node1.2.2>
        <node1.2.3>Doctors</node1.2.3>
      </node1.2>
    </node1>
</nodeA.2>
<nodeA.3>Car 1</nodeA.3>
</nodeA>

【问题讨论】:

“还有其他读取 XML 的方法吗?” - 很多。告诉我你想要实现什么(最终,不是一些 - 看起来相关 - 在你当前的解决方案中的步骤),我很乐意为你提供我喜欢的方法 @sehe 我需要读取传入我的函数的 XML,它s not always the same XML their some nodes that can exist but on another XML file they may not. So I have an architecture of fields and Im 验证这些字段是否存在于 XML 中,如果它们存在,我ll copy their values, if not I将跳过它。 在您的代码中听起来像是 XSLT 或 Xpath 的工作。我认为您应该在这里提出真正的问题,这样我们就可以向您展示如何实现该目标(只需提供示例输入/输出以及您尝试过的内容,这已经部分包含在此问题中)。 供参考:xyproblem.info @sehe 我添加了一个示例,我需要将这些值复制到 Form 中的 MFC 应用程序 【参考方案1】:

使用 pt.get_child_optional(...) 来防止异常。 pt.find(...) 返回一个迭代器,它在失败时将 true 与 pt.not_found() 进行比较。

编辑:如何使用 boost::optional

boost::optional< iptree & > chl =  pt.get_child_optional(fieldname); 

    if(chl)  
      for( auto a : *chl ) 
        std::cerr << ":" << a.first << ":" << std::endl; 
     

【讨论】:

我试过 pt.get_child_optional 但我在 for (const auto& kv : children) 上有一个错误,即使有孩子如果我做了 if (child) 它返回 false @melom 你必须在迭代之前检查你的 boost::optional 的有效性。我已经扩展了这个例子。 谢谢我没有错误,但是如果您看到我更新的示例 node1 不会被识别为有一个孩子!即使我有 2 个嵌套的孩子,有时我有 但对于我的初始错误,您的代码工作正常 @melom 我会提出一个新的请求,并从中运行示例代码。

以上是关于使用 Boost 在 XML 中查找密钥的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 regex/boost 查找 2 个数字之间的数字

使用 boost 库查找交点

如何提高 boost interval_map 查找的性能

使用Boost Graph库查找连接的组件,顶点和边缘类型为boost :: listS

在 C++ 中使用正则表达式查找 [/ 和 ] 之间的数字

使用 boost 字符串查找最后一次出现