如何在QT中使用XML StreamReader

How to use XML StreamReader in Qt?

本文关键字:XML StreamReader QT      更新时间:2023-10-16

我有这个xml位于c:/project/setting.xml

<?xml version='1.0'?>
<configs>
  <interval>10</interval>
  <size>176,144</size>
</configs>

如何链接到我的QT项目?

以及如何在.cpp文件中调用我的xml的间隔和尺寸值?

谢谢。

我通常更喜欢直接与DOM文档直接合作以进行读取,而仅使用流媒体进行写作(QXmlStreamWriter(。使用QXmlStreamReader非常费力,因为为了获得最大的鲁棒性,您必须考虑读者当前位置的所有可能性。如果您不介意更改阅读方法,则可以查看此答案。

QT已经提供了有关如何使用DOM文档的良好教程,但是在这里您可以简化当前问题的版本。只需将XML模块添加到您的QT项目即可。

#include <QtXML>
bool readXML(const QString& path)
{
  try {
    QFile inFile(path);
    if (!inFile.open(QFile::ReadOnly)) return false;
    QDomDocument xml("xml");
    xml.setContent(inFile.readAll());
    auto configs = xml.documentElement();
    if (configs.tagName() != "configs") return false;
    // No error checking nor other type conversion done here
    qDebug() << configs.firstChildElement("interval").firstChild().nodeValue();
    qDebug() << configs.firstChildElement("size").firstChild().nodeValue();
  } catch (...) {
    return false;
  }
  return true;
}

它不会进行严格的错误检查,只是其中两个例子。您应该始终检查当前节点是否真正存在。

重要说明: dom模型的一个棘手部分是,

不给出像 <interval>10</interval>这样的节点的实际值
auto interval = configs.firstChildElement("interval");
qDebug() << interval.nodeValue();

但是

auto interval = configs.firstChildElement("interval");
qDebug() << interval.firstChild().nodeValue();

文本节点实际上是interval节点的第一个孩子。请记住这一点。


如果要导航XML,该XML包含在同一级别上具有相同名称的几个元素,例如

<?xml version='1.0'?>
<configs>
  <interval>10</interval>
  <interval>100</interval>
  <interval>1000</interval>
  <size>176,144</size>
</configs>

您可以使用nextSiblingElement方法获取下一个元素:

for (auto interval = configs.firstChildElement("interval");
     !interval.isNull();
     interval= interval.nextSiblingElement("interval")) {
  // ...
}