【问题标题】:reading an XML file in a C++ program在 C++ 程序中读取 XML 文件
【发布时间】:2012-02-27 22:18:05
【问题描述】:

我正在尝试在我的 C++ 程序中读取 XML 文件。 XML 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<myprogram>
<configuration>
<window>
<height> 300 </height>
<width> 500 </width>
</window>
</configuration>
</myprogram>

现在我可以查看 XML 文件并尝试像这样读取它:

ifstream in("mydata.xml");

//ignore the <?xml line
in.ignore(200, '\n');

//i know that the first value i want is the window height so i can ignore <myprogram> <configuration> and <window>

//ignore <myprogram>
in.ignore(200, '\n');

//ignore <configuration>
in.ignore(200, '\n');

//ignore <window>
in.ignore(200, '\n');

string s; int height;

//okay, now i have my height
in >> s >> height;

总的来说,这似乎是个坏主意,它确实限制了 XML 文件的修改方式。上述解决方案非常手动,如果 XML 中的任何内容发生变化,似乎必须更改整个读取方法。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 我已经好几年没用过 c++ 了,所以我不能说出一个名字,但是用谷歌搜索一个 c++ 的 xml 解析器,我相信你会找到一些东西的。

标签: c++ xml


【解决方案1】:

你可以使用一些库来为你做这件事。如果你在 Windows 平台上工作,你可以使用MSXML,它已经是系统的一部分。

检查这个问题:Read Write XML File In C++

其他流行的库:

【讨论】:

  • MSXML 听起来像是我正在寻找的东西。这是一个 Windows 程序,所以我会先尝试一下。感谢您的提示。
  • 投票支持 RapidXml,因为它是一个没有依赖项的仅标头库。
【解决方案2】:

您将需要一个 XML 解析器。那里有一堆:

我个人最喜欢的是 pugiXML,但这是个人喜好问题。

【讨论】:

    【解决方案3】:

    boost 属性树与 xml 配合得很好,我会使用它。

    【讨论】:

    • 我认为你不会比 Boost 用于属性树的 RapidXml 库获得太多。除非您已经在使用 Boost,否则这将添加一个很大的依赖项而不是单个头文件 (RapidXml)。
    • 确实,这完全取决于人们已经在使用什么库以及他们是否需要跨平台兼容性
    【解决方案4】:

    您可以使用具有解析 XML 功能的 POCO 库

    【讨论】:

      【解决方案5】:

      在多平台源代码中我通常使用 Qt XML 阅读器。

      您有 3 种阅读方式:

      1. Qt core QXmlStreamReader - Qt 的 XML 读取方式
      2. SAX2 reader - 具有 内容处理 类的标准 SAX2 阅读器
      3. DOM reader - 带有 XML 节点的 DOM 文档阅读器

      如果您只编写 Windows 软件,则应使用 MSXML 6。因为 Windows XP SP3 MSXML 6.0 是操作系统的一部分。

      在 Linux 上,您应该使用 libxml2

      【讨论】:

      • 当他可以拥有 C++ 库时,为什么还要选择 C ​​XML 库?
      • @pmr:为什么不呢?在许多情况下,纯 C 库更快。 libxml2是常用的,一般在机器上,所以他不再做一个依赖。
      • 根据我的经验,C 库在惯用的 C++ 中经常感觉很奇怪,需要进行一些包装,并且不能与其他代码和更大的代码库很好地集成。但这可能是非常主观的。
      • @pmr:在 Linux 上许多基于 libxml2 的 C++ xml 阅读器(例如:VTK 的解析器)。如果你检查this example,你会发现这个C库不是编码地狱。不过基本同意,所以我一般用Qt的方式解析。
      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多