QDomDocument Class

QDomDocument 类代表一个 XML 文档。更多

Header: #include <QDomDocument>
CMake: find_package(Qt6 REQUIRED COMPONENTS Xml)
target_link_libraries(mytarget PRIVATE Qt6::Xml)
qmake: QT += xml
继承: QDomNode

注意:该类中的所有函数都是可重入的

公共类型

(since 6.5) struct ParseResult
(since 6.5) enum class ParseOption { Default, UseNamespaceProcessing, PreserveSpacingOnlyNodes }
flags ParseOptions

公共函数

QDomDocument()
QDomDocument(const QDomDocumentType &doctype)
QDomDocument(const QString &name)
QDomDocument(const QDomDocument &document)
~QDomDocument()
QDomAttr createAttribute(const QString &name)
QDomAttr createAttributeNS(const QString &nsURI, const QString &qName)
QDomCDATASection createCDATASection(const QString &value)
QDomComment createComment(const QString &value)
QDomDocumentFragment createDocumentFragment()
QDomElement createElement(const QString &tagName)
QDomElement createElementNS(const QString &nsURI, const QString &qName)
QDomEntityReference createEntityReference(const QString &name)
QDomProcessingInstruction createProcessingInstruction(const QString &target, const QString &data)
QDomText createTextNode(const QString &value)
QDomDocumentType doctype() const
QDomElement documentElement() const
QDomElement elementById(const QString &elementId)
QDomNodeList elementsByTagName(const QString &tagname) const
QDomNodeList elementsByTagNameNS(const QString &nsURI, const QString &localName)
QDomImplementation implementation() const
QDomNode importNode(const QDomNode &importedNode, bool deep)
QDomNode::NodeType nodeType() const
(since 6.5) QDomDocument::ParseResult setContent(QAnyStringView text, QDomDocument::ParseOptions options = ParseOption::Default)
(since 6.5) QDomDocument::ParseResult setContent(QIODevice *device, QDomDocument::ParseOptions options = ParseOption::Default)
(since 6.5) QDomDocument::ParseResult setContent(QXmlStreamReader *reader, QDomDocument::ParseOptions options = ParseOption::Default)
(since 6.5) QDomDocument::ParseResult setContent(const QByteArray &data, QDomDocument::ParseOptions options = ParseOption::Default)
QByteArray toByteArray(int indent = 1) const
QString toString(int indent = 1) const
QDomDocument &operator=(const QDomDocument &other)

详细描述

QDomDocument 类代表整个 XML 文档。从概念上讲,它是文档树的根,是访问文档数据的主要途径。

由于元素、文本节点、注释、处理指令等不能脱离文档而存在,因此文档类还包含创建这些对象所需的工厂函数。创建的节点对象有一个ownerDocument() 函数,用于将它们与创建它们的文档关联起来。最常用的 DOM 类有QDomNode 、QDomDocument、QDomElementQDomText

解析后的 XML 在内部由一棵对象树表示,可以使用各种 QDom 类访问这些对象。所有 QDom 类都只引用内部树中的对象。一旦引用这些对象的最后一个 QDom 对象或 QDomDocument 本身被删除,DOM 树中的内部对象就会被删除。

元素、文本节点等的创建是通过该类提供的各种工厂函数完成的。使用 QDom 类的默认构造函数只会产生无法操作或插入到文档中的空对象。

QDomDocument 类有多个用于创建文档数据的函数,例如createElement(),createTextNode(),createComment(),createCDATASection(),createProcessingInstruction(),createAttribute() 和createEntityReference() 。其中一些函数有支持命名空间的版本,例如createElementNS() 和createAttributeNS()。createDocumentFragment() 函数用于保存部分文档;这对于处理复杂文档非常有用。

文档的全部内容用setContent() 设置。该函数将传入的字符串解析为 XML 文档,并创建表示文档的 DOM 树。根元素可通过documentElement() 获取。文档的文本表示可通过toString() 获取。

注意: 如果 XML 文档较大,DOM 树可能会占用大量内存。对于此类文档,QXmlStreamReader 类可能是更好的解决方案。

使用importNode() 可以将另一个文档中的节点插入到文档中。

您可以使用elementsByTagName() 或elementsByTagNameNS() 获取具有特定标记的所有元素的列表。

QDom 类的典型用法如下:

QDomDocument doc("mydocument");
QFile file("mydocument.xml");
if (!file.open(QIODevice::ReadOnly))
    return;
if (!doc.setContent(&file)) {
    file.close();
    return;
}
file.close();

// print out the element names of all elements that are direct children
// of the outermost element.
QDomElement docElem = doc.documentElement();

QDomNode n = docElem.firstChild();
while(!n.isNull()) {
    QDomElement e = n.toElement(); // try to convert the node to an element.
    if(!e.isNull()) {
        cout << qPrintable(e.tagName()) << '\n'; // the node really is an element.
    }
    n = n.nextSibling();
}

// Here we append a new element to the end of the document
QDomElement elem = doc.createElement("img");
elem.setAttribute("src", "myimage.png");
docElem.appendChild(elem);

一旦docelem 退出作用域,代表 XML 文档的整个内部树就会被删除。

要使用 DOM 创建文档,请使用如下代码:

QDomDocument doc;
QDomElement root = doc.createElement("MyML");
doc.appendChild(root);

QDomElement tag = doc.createElement("Greeting");
root.appendChild(tag);

QDomText t = doc.createTextNode("Hello World");
tag.appendChild(t);

QString xml = doc.toString();

有关文档对象模型的更多信息,请参阅《文档对象模型 (DOM)1 级2 级核心规范》。

另请参阅 DOM 书签应用程序

成员类型文档

[since 6.5] 枚举类 QDomDocument::ParseOption
flags QDomDocument::ParseOptions

该枚举描述了使用setContent() 方法解析 XML 文档时可能使用的选项。

常量说明
QDomDocument::ParseOption::Default0x00未设置解析选项。
QDomDocument::ParseOption::UseNamespaceProcessing0x01已启用命名空间处理。
QDomDocument::ParseOption::PreserveSpacingOnlyNodes0x02只保留包含间隔字符的文本节点。

该枚举在 Qt 6.5 中引入。

ParseOptions 类型是QFlags<ParseOption> 的类型定义。它存储 ParseOption 值的 OR 组合。

另请参阅 setContent().

成员函数文档

[since 6.5] QDomDocument::ParseResult QDomDocument::setContent(QAnyStringView text, QDomDocument::ParseOptions options = ParseOption::Default)

[since 6.5] QDomDocument::ParseResult QDomDocument::setContent(QIODevice *device, QDomDocument::ParseOptions options = ParseOption::Default)

[since 6.5] QDomDocument::ParseResult QDomDocument::setContent(QXmlStreamReader *reader, QDomDocument::ParseOptions options = ParseOption::Default)

[since 6.5] QDomDocument::ParseResult QDomDocument::setContent(const QByteArray &data, QDomDocument::ParseOptions options = ParseOption::Default)

该函数解析字节数组data 、字符串视图text 、IOdevice 或流reader 中的 XML 文档,并将其设置为文档内容。它会根据 XML 规范检测文档的编码。返回ParseResult 中的解析结果,明确转换为bool

您可以使用options 参数指定不同的解析选项,例如启用命名空间处理等。

默认情况下,命名空间处理是禁用的。如果禁用,解析器在读取 XML 文件时就不会进行命名空间处理。函数QDomNode::prefix(),QDomNode::localName() 和QDomNode::namespaceURI() 返回空字符串。

如果通过解析options 启用了命名空间处理,解析器就会识别 XML 文件中的命名空间,并将前缀名、本地名和命名空间 URI 设置为适当的值。函数QDomNode::prefix(),QDomNode::localName() 和QDomNode::namespaceURI() 会为所有元素和属性返回一个字符串,如果元素或属性没有前缀,则返回空字符串。

仅由空白构成的文本节点会被剥离,不会出现在QDomDocument 中。自 Qt 6.5 起,可以将QDomDocument::ParseOption::PreserveSpacingOnlyNodes 作为解析选项,指定必须保留仅有空白的文本节点。

实体引用的处理方法如下:

  • 对内容中出现的内部一般实体和字符实体的引用也包括在内。结果是一个QDomText 节点,其中的引用被其相应的实体值取代。
  • 对内部子集中出现的参数实体的引用也包括在内。结果是一个包含实体和符号声明的QDomDocumentType 节点,其中的引用被其相应的实体值替换。
  • 任何未在内部子集中定义且在内容中出现的一般解析实体引用都将表示为QDomEntityReference 节点。
  • 任何未在内部子集中定义且出现在内容之外的已解析实体引用都会被空字符串替换。
  • 任何未解析的实体引用都将被替换为空字符串。

注意: 如果 IOdevice 尚未打开,重载将尝试以只读模式打开。在这种情况下,调用者有责任调用 close。这在 Qt XML 7 中将会改变,它将不再打开 IOdevice 。因此,应用程序应在调用setContent() 之前自行打开设备。

此函数在 Qt 6.5 中引入。

另请参阅 ParseResultParseOptions

QDomDocument::QDomDocument()

构造一个空文档。

[explicit] QDomDocument::QDomDocument(const QDomDocumentType &doctype)

创建文档类型为doctype 的文档。

另请参阅 QDomImplementation::createDocumentType() 。

[explicit] QDomDocument::QDomDocument(const QString &name)

创建文档并将文档类型名称设置为name

QDomDocument::QDomDocument(const QDomDocument &document)

构造document 的副本。

副本的数据是共享的(浅层副本):修改一个节点也会改变另一个节点。如果要进行深度复制,请使用cloneNode() 。

[noexcept] QDomDocument::~QDomDocument()

销毁对象并释放其资源。

QDomAttr QDomDocument::createAttribute(const QString &name)

创建名为name 的新属性,该属性可插入到元素中,例如使用QDomElement::setAttributeNode() 。

如果name 不是一个有效的 XML 名称,则该函数的行为受QDomImplementation::InvalidDataPolicy 约束。

另请参见 createAttributeNS()。

QDomAttr QDomDocument::createAttributeNS(const QString &nsURI, const QString &qName)

创建一个支持命名空间的新属性,可插入元素中。属性名称为qName ,命名空间 URI 为nsURI 。该函数还将QDomNode::prefix() 和QDomNode::localName() 设置为适当的值(取决于qName )。

如果qName 不是有效的 XML 名称,则该函数的行为受QDomImplementation::InvalidDataPolicy 约束。

另请参见 createAttribute()。

QDomCDATASection QDomDocument::createCDATASection(const QString &value)

为字符串value 创建一个新的 CDATA 部分,该部分可插入文档,例如使用QDomNode::appendChild() 插入。

如果value 包含不能存储在 CDATA 部分的字符,则该函数的行为受QDomImplementation::InvalidDataPolicy 的约束。

另请参见 QDomNode::appendChild()、QDomNode::insertBefore() 和QDomNode::insertAfter()。

QDomComment QDomDocument::createComment(const QString &value)

为字符串value 创建新注释,该注释可插入文档,例如使用QDomNode::appendChild() 。

如果value 包含不能存储在 XML 注释中的字符,则该函数的行为受QDomImplementation::InvalidDataPolicy 的约束。

另请参见 QDomNode::appendChild()、QDomNode::insertBefore() 和QDomNode::insertAfter()。

QDomDocumentFragment QDomDocument::createDocumentFragment()

创建一个新的文档片段,用于保存部分文档,例如在对文档树进行复杂操作时。

QDomElement QDomDocument::createElement(const QString &tagName)

创建名为tagName 的新元素,该元素可插入 DOM 树,例如使用QDomNode::appendChild() 插入。

如果tagName 不是一个有效的 XML 名称,则该函数的行为受QDomImplementation::InvalidDataPolicy 约束。

另请参见 createElementNS()、QDomNode::appendChild()、QDomNode::insertBefore() 和QDomNode::insertAfter()。

QDomElement QDomDocument::createElementNS(const QString &nsURI, const QString &qName)

创建一个支持命名空间的新元素,可插入 DOM 树中。元素名称为qName ,命名空间 URI 为nsURI 。该函数还会将QDomNode::prefix() 和QDomNode::localName() 设置为适当的值(取决于qName )。

如果qName 是空字符串,则无论是否设置了无效数据策略,都会返回一个空元素。

另请参见 createElement()。

QDomEntityReference QDomDocument::createEntityReference(const QString &name)

创建名为name 的新实体引用,该引用可插入文档,例如使用QDomNode::appendChild() 插入。

如果name 不是一个有效的 XML 名称,则该函数的行为受QDomImplementation::InvalidDataPolicy 约束。

另请参阅 QDomNode::appendChild()、QDomNode::insertBefore() 和QDomNode::insertAfter()。

QDomProcessingInstruction QDomDocument::createProcessingInstruction(const QString &target, const QString &data)

创建可插入文档的新处理指令,例如使用QDomNode::appendChild() 。该函数将处理指令的目标设为target ,将数据设为data

如果target 不是有效的 XML 名称,或者数据包含不能出现在处理指令中的字符,则该函数的行为受QDomImplementation::InvalidDataPolicy 的约束。

另请参见 QDomNode::appendChild()、QDomNode::insertBefore() 和QDomNode::insertAfter()。

QDomText QDomDocument::createTextNode(const QString &value)

为字符串value 创建一个文本节点,该节点可插入文档树,例如使用QDomNode::appendChild() 插入。

如果value 包含不能作为 XML 文档字符数据存储的字符(即使是字符引用形式),则该函数的行为受QDomImplementation::InvalidDataPolicy 的约束。

另请参见 QDomNode::appendChild()、QDomNode::insertBefore() 和QDomNode::insertAfter()。

QDomDocumentType QDomDocument::doctype() const

返回此文档的文档类型。

QDomElement QDomDocument::documentElement() const

返回文档的根元素。

QDomElement QDomDocument::elementById(const QString &elementId)

返回 ID 等于elementId 的元素。如果没有找到 ID 相同的元素,则返回null element

由于 QDomClasses 不知道哪些属性是元素 ID,因此该函数总是返回null element 。这可能会在以后的版本中改变。

QDomNodeList QDomDocument::elementsByTagName(const QString &tagname) const

返回一个QDomNodeList ,其中包含文档中名称为tagname 的所有元素。节点列表的顺序与元素树预序遍历中遇到的顺序一致。

另请参阅 elementsByTagNameNS() 和QDomElement::elementsByTagName()。

QDomNodeList QDomDocument::elementsByTagNameNS(const QString &nsURI, const QString &localName)

返回一个QDomNodeList ,其中包含本地名称为localName 、命名空间 URI 为nsURI 的文档中的所有元素。节点列表的顺序是在元素树的预排序遍历中遇到的顺序。

另请参见 elementsByTagName() 和QDomElement::elementsByTagNameNS()。

QDomImplementation QDomDocument::implementation() const

返回QDomImplementation 对象。

QDomNode QDomDocument::importNode(const QDomNode &importedNode, bool deep)

将节点importedNode 从另一个文档导入此文档。importedNode 保留在原始文档中;此函数创建了一个副本,可在此文档中使用。

此函数返回属于本文档的导入节点。返回的节点没有父节点。无法导入QDomDocumentQDomDocumentType 节点。在这种情况下,此函数将返回null node

如果importedNodenull node ,则返回一个空节点。

如果deep 为真,则该函数不仅导入importedNode 节点,而且导入其整个子树;如果 为假,则只导入importedNode 。参数deepQDomAttrQDomEntityReference 节点没有影响,因为QDomAttr 节点的子节点总是被导入,而QDomEntityReference 节点的子节点从不被导入。

根据节点类型的不同,该函数的行为也略有不同:

节点类型行为
QDomAttr在生成的属性中,所有者元素被设置为 0,指定的标志被设置为 true。属性节点总是导入importedNode 的整个子树:deep 没有影响。
QDomDocument不能导入文档节点。
QDomDocumentFragment如果deep 为 true,该函数将导入整个文档片段;否则只生成一个空文档片段。
QDomDocumentType不能导入文档类型节点。
QDomElementQDomAttr::specified() 为真的属性也会被导入,其他属性不会被导入。如果deep 为真,该函数也会导入importedNode 的子树;否则,它只导入元素节点(和一些属性,见上文)。
QDomEntity实体节点可以导入,但目前还无法使用,因为文档类型在 DOM 2 级中是只读的。
QDomEntityReference实体引用节点的后代永远不会被导入:deep 没有任何作用。
QDomNotation符号节点可以导入,但目前还无法使用,因为 DOM 2 级的文档类型是只读的。
QDomProcessingInstruction处理指令的目标和值被复制到新节点。
QDomText文本被复制到新节点。
QDomCDATASection文本被复制到新节点。
QDomComment文本被复制到新节点。

另请参阅 QDomElement::setAttribute()、QDomNode::insertBefore()、QDomNode::insertAfter()、QDomNode::replaceChild()、QDomNode::removeChild() 和QDomNode::appendChild()。

QDomNode::NodeType QDomDocument::nodeType() const

返回DocumentNode

QByteArray QDomDocument::toByteArray(int indent = 1) const

将解析后的文档转换回文本表示形式,并返回包含以 UTF-8 编码的数据的QByteArray

该函数使用indent 作为子元素的缩进空间。

另请参见 toString()。

QString QDomDocument::toString(int indent = 1) const

将解析后的文档转换回文本表示形式。

该函数使用indent 作为子元素的缩进空间。

如果indent 为-1,则不添加任何空白。

QDomDocument &QDomDocument::operator=(const QDomDocument &other)

为该 DOM 文档指定other

副本的数据是共享的(浅层副本):修改一个节点也会改变另一个节点。如果要进行深度复制,请使用cloneNode() 。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.