【问题标题】:Adding/removing specific elements from xml file, in Qt?在 Qt 中从 xml 文件中添加/删除特定元素?
【发布时间】:2015-03-09 05:08:14
【问题描述】:

我有一个 XML 文档,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<items>
<item s_no="1">
    <title>title_1</title>
    <path>path1</path>
    <desc>descriptoion1</desc>
</item>

<item s_no="2">
    <title>title_2</title>
    <path>path2</path>
    <desc>descriptoion2</desc>
</item>

这是从 Qt 中的QXmlStreamWriter 生成的。我想要一个函数来添加 &lt;item&gt; 标记以及 &lt;title&gt;, &lt;path&gt; 等所有元素,并且我想要一个函数通过识别 s_no 属性来删除项目标记。所有这些都应该完成,不会影响文件中的任何其他内容。

我搜索了很多,我知道有类似的问题,我尝试了一些代码,但没有成功。 QDomDocument 中是否有任何功能可以做到这一点?

【问题讨论】:

    标签: c++ xml qt file stream


    【解决方案1】:

    当我过去考虑这样做时,这并不是一件小事。

    QDomDocumentQDomNode

    我认为您应该可以使用 QDomDocumentQDomNode 来做到这一点。有时很难在类文档的主页上看到所有可能的功能,因为它可以从它派生的抽象类中获得很多...单击“所有成员列表”显示完整列表.

    http://doc.qt.io/qt-5/qdomdocument-members.html

    一些看起来很有希望的电话包括:childNodeselementByIdelementsByTagNamecreateNodeinsertBeforeinsertAfterremoveChild

    更新:一个工作示例,展示了如何在 QDomDocument 上删除和插入节点的直接方式。

    https://github.com/peteristhegreat/xml_insert_remove

    注意,添加QDomNodes/QDomElements等时,每个元素都需要在文档上创建,否则离开函数时它不会留在范围内。

    QXmlStreamReaderQXmlStreamWriter

    我(几年前)看到的一些文档说他们强烈建议使用QXmlStream* 类,因为它们得到了更好的支持,或者最近得到了维护。我认为它具有更好的错误处理能力,并且不必加载整个文档即可使用。

    就编辑文档并重新保存而言,我所知道的最直接的方法是读取所有内容,并将其存储为嵌套的 C++ 类,然后将它们写出来。

    QJson 示例(类似于QXmlStream*

    有一个与 Json 类似的示例,它真正展示了将读取和写入函数子类化到您的模型中的强大功能。

    http://doc.qt.io/qt-5/qtcore-json-savegame-example.html

    我认为类似的方法可以用 XML 的流读取器和写入器类来完成。

    希望对您有所帮助。

    【讨论】:

    • 我一般用QDomDocument来做,但不能说是不是最好。如果您提供示例代码,我会投票赞成。
    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多