【问题标题】:Parse a xml file using c++ & Qt使用 c++ 和 Qt 解析 xml 文件
【发布时间】:2012-10-06 12:06:41
【问题描述】:

我尝试解析具有以下结构的 XML 文件:

<I>
  <C c="test1">
     <H><Pd pd="123"/>
        <f p="789" r="456"/>
     </H>
     <M m="test2">
       <H><Pd pd="3456"/><R r="678"/>
       </H>
     </M>
  </C>
  <T t="0">
     <T2>123</T2>
     <T3>2345</T3>
  </T>
  <T t="1">
     <T1>23456</T1>
     <T2>23</T2>
     <T3>123</T3>
     <T4>456</T4>
  </T>
</I>

我有一个数字列表,例如0 和 1 以及搜索模式,例如'23' 现在我想用 t="a number from my list" 在 XML 文件中搜索所有 T 节点,其中一个子节点(T1、T2、T3)包含搜索模式。

谁能帮我解决这个问题?我想使用 Qt 功能,但不知道如何开始。

我对每一个提示都很满意!

【问题讨论】:

  • 首先尝试递归地构建一棵树。然后搜索树进行查询。最好能提供XML文件的准确结构。
  • 首先确保您的 XML 遵循特定的模式,然后查看 XQuery。
  • @Md. Taufique Hussaiun XML 结构就像我粘贴的一样,除了有更多的 节点。除此之外,这就是确切的结构。
  • @Component10 XML 遵循特定的 shema (I->T->T1)。谢谢你,我会看看 XQuery 能为我做什么 :)
  • 看看 QXmlStreamReader - doc.qt.digia.com/qt/qxmlstreamreader.html

标签: c++ xml qt xml-parsing


【解决方案1】:

未经测试,但这是我已经使用 Qt 扫描一个非常简单的 XML 文件的一种方式。也许这可以给你一个提示如何在这里使用它:

QDomElement docElem;
QDomDocument xmldoc;

xmldoc.setContent(YOUR_XML_DATA);
docElem=xmldoc.documentElement();

if (docElem.nodeName().compare("T")==0)
{
    QDomNode node=docElem.firstChild();
    while (!node.isNull())
    {
        quint32 number = node.toElement().attribute("t").toUInt(); //or whatever you want to find here..
        //do something
        node = node.nextSibling();
    }
}

【讨论】:

  • 为了安全起见,您应该调用 node.toElement() 并将其存储到 QDomElement 变量中,然后查看它是否为空。在 XML 中可能存在 cmets 的情况下,您将收到错误消息。您也可以调用 docElem.firstChildElement() 并跳过所有非元素节点。
  • 一年后我变得更聪明了,我也建议现在使用 QXmlStreamReader,因为它更简单,并且将成为 Qt 的未来;-)。但是 - 上面的代码仍然适用于当前版本...
【解决方案2】:

对于 XML 的东西,建议使用 QtCore 模块中的 QXmlStreamReader 和 QXmlStreamWriter,只是因为 QDom 和 QSax 的东西已经有一段时间没有积极维护了。

http://doc.qt.digia.com/4.7/qxmlstreamreader.html

http://doc.qt.digia.com/4.7/qxmlstreamwriter.html

我不会将示例代码从 qt 文档复制并粘贴到此处。希望你能很好地理解它们。您还可以查看 qt 4.x 中的 examples/xml 目录。

【讨论】:

  • 我只是用qdom实现了它,但我会看看qxmlstreamreader。感谢您的提示!
【解决方案3】:

您可以使用 QXmlQuery。它的作用类似于 XQuery(我猜语法是一样的)。您可以利用 XQuery 的灵活性来解析您的 xml 文件。 你可以从这样的代码开始:

QByteArray myDocument;
QBuffer buffer(&myDocument); // This is a QIODevice.
buffer.open(QIODevice::ReadOnly);
QXmlQuery query;
query.bindVariable("myDocument", &buffer);
query.setQuery("doc($myDocument)");

setQuery 方法允许您定义您的搜索模式。它可以基于元素 id、属性等等……就像 XQuery 一样。这是 QXmlQuery 文档页面: link

【讨论】:

  • 我用 qdom 实现了它,但我会通过 qxmlreader 来阅读。感谢您的意见!
猜你喜欢
  • 2013-07-11
  • 2021-03-27
  • 2013-05-29
  • 2015-03-14
  • 2011-03-06
  • 2023-03-06
  • 2013-07-22
  • 1970-01-01
相关资源
最近更新 更多