在Qt中添加/删除xml文件中的特定元素?

时间:2015-01-11 07:33:07

标签: c++ xml qt file stream

我有一个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生成的。我想要一个函数来添加<item>标记以及<title>, <path>等所有元素。我想要一个函数通过标识s_no属性来删除项标记。所有这一切都应该完成,而不会影响文件中的任何其他内容。

我经常搜索,我知道有类似的问题,我尝试了一些代码,但它没有用。在QDomDocument

中是否有任何功能可以执行此操作

1 个答案:

答案 0 :(得分:1)

当我过去考虑这样做时,它实际上并不是一件微不足道的事情。

QDomDocumentQDomNode

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

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

有些看似有希望的电话包括:childNodes elementById elementsByTagName createNode insertBefore insertAfter removeChild

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

enter image description here

https://github.com/peteristhegreat/xml_insert_remove

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

QXmlStreamReaderQXmlStreamWriter

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

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

QJson示例(类似于QXmlStream *

Json有一个类似的例子,它真正展示了将read和write函数子类化到模型中的能力。

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

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

希望有所帮助。