【问题标题】:Parsing XML's with Boost PTree w/o tags使用不带标签的 Boost PTree 解析 XML
【发布时间】:2020-11-18 00:35:06
【问题描述】:

我想知道 Boost Ptree 是否允许在不知道属性标签的情况下解析 .xml 文件。我有一个 XML 文件,它会定期用新标签、新数据更新,甚至删除某些标签。这些常规更改促使我研究在不硬编码属性名称的情况下解析文件。有什么方法可以在不说明标签名称的情况下读取 XML 文件中的所有数据?任何帮助表示赞赏!

【问题讨论】:

  • 请帮自己一个忙,使用 XML 库。属性树不是 XML。此外,读取文件总是在没有说明标签名称的情况下完成。
  • @sehe 感谢您的回复!我知道 Ptrees 并不适合解析 XML,但 Boost 是如此集成到我的项目的其余部分中,以至于使用 libxml2 或其他解析器会非常费力。当我使用 read_xml 时,似乎我必须声明标签名称。似乎没有一种方法可以读取父节点下的所有子节点并存储它们。我也通读了 boost 文档,但似乎找不到任何东西。你知道 boost 如何获取子节点或我可以查看的其他 c++ 解析器吗?

标签: c++ visual-studio boost xml-parsing ptree


【解决方案1】:

Ptrees 不是解析 XML 的理想选择,但 Boost 与我的项目的其余部分集成得如此之好,以至于使用 libxml2 或其他解析器会非常费力

对不起,这没有意义。

有仅标题选项和大量非常轻量级的选项。见What XML parser should I use in C++?

由于 Boost 属性树显然不是您需要的库,因此添加库的感知成本将远远超过与您将遇到的被破坏的抽象和不可能性作斗争的成本。

似乎我在使用 read_xml 时确实必须说明标签名称。似乎没有一种方法可以读取父节点下的所有子节点并存储它们。

给你:

#include <boost/property_tree/xml_parser.hpp>

int main() {
    boost::property_tree::ptree pt;
    std::ifstream ifs("input.xml");

    read_xml(ifs, pt);
    write_xml(std::cout, pt);
}

我也通读了 boost 文档,但似乎找不到任何东西。

我将从这里开始:https://www.boost.org/doc/libs/1_73_0/doc/html/property_tree/parsers.html#property_tree.parsers.xml_parser。专注于局限性。并非所有的限制都是明确的(参见 RadidXML 的文档)。

你知道 boost 如何获取子节点或我可以查看的其他 c++ 解析器吗?

见上面的第一个链接:)

另见:

  • 在我的答案中搜索"not an xml library"
  • 任何Property Tree answers using XML 都同上 - 请注意,我们从不指定要读取的节点 - 因为这根本不可能。但是,许多答案详细说明了如何通过某些动态路径查找节点,如果那是您真正要查找的内容
  • 我的一些answers that use PugiXML - 其中大部分是针对 Boost Property Tree 无法处理的问题的回答
  • 其他一些库TinyXML、RapidXML,只是为了了解它们什么时候适合/好不好

【讨论】:

  • 这真的很有帮助,你太棒了!谢谢。
  • 谢谢@AlexiaM.. 也请考虑voting
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多