使用 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 I
m 验证这些字段是否存在于 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以上是关于使用 Boost 在 XML 中查找密钥的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中使用 regex/boost 查找 2 个数字之间的数字