本页内容

QDomDocument Class

QDomDocument 类表示一个 XML 文档。更多内容...

标题: #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、QDomElement 和QDomText 。

解析后的 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);

一旦 `doc ` 和 `elem ` 超出作用域,表示 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)的更多信息,请参阅《文档对象模型(DOM)第 1 级和第 2 级核心规范》。

另请参阅 DOM 书签应用程序。

成员类型文档

[since 6.5] enum class QDomDocument::ParseOption
flags QDomDocument::ParseOptions

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

常量值描述
QDomDocument::ParseOption::Default0x00未设置任何解析选项。
QDomDocument::ParseOption::UseNamespaceProcessing0x01启用命名空间处理。
QDomDocument::ParseOption::PreserveSpacingOnlyNodes0x02仅包含空格字符的文本节点将被保留。

该枚举在 Qt 6.5 中引入。

ParseOptions 类型是QFlags<ParseOption> 的 typedef。它存储了 ParseOption 值的或(OR)组合。

另请参阅 setContent()。

成员函数文档

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 ` 是空字符串,则无论是否设置了无效数据策略,均返回 null 元素。

另请参阅 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 名称,或者 data 中包含不能出现在处理指令中的字符,则该函数的行为由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 仍保留在原始文档中;该函数会创建一个副本,可在本文档中使用。

此函数返回属于本文档的已导入节点。返回的节点没有父节点。无法导入QDomDocument 和QDomDocumentType 节点。在这些情况下,此函数返回一个null node 。

如果 `importedNode ` 是一个 `null node`,则返回一个空节点。

如果deep 为 true,该函数不仅导入节点importedNode ,还会导入其整个子树;如果为 false,则仅导入importedNode 。参数deep 对QDomAttr 和QDomEntityReference 节点没有影响,因为QDomAttr 节点的后代总是会被导入,而QDomEntityReference 节点的后代则永远不会被导入。

该函数的行为会因节点类型而略有不同:

节点类型行为
QDomAttr在生成的属性中,所有者元素被设置为 0,且指定的标志被设置为 true。对于属性节点,importedNode 的整个子树总是会被导入:deep 没有效果。
QDomDocument文档节点无法被导入。
QDomDocumentFragment如果deep 为 true,则该函数导入整个文档片段;否则,它仅生成一个空文档片段。
QDomDocumentType文档类型节点无法被导入。
QDomElement对于QDomAttr::specified() 为 true 的属性也会被导入,其他属性则不会被导入。如果deep 为 true,则此函数还会导入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 。

[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 、IO对象device 或流reader 中解析XML文档,并将解析结果设为文档的内容。它会根据XML规范尝试检测文档的编码。将解析结果返回至ParseResult ,该参数会显式转换为bool 。

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

默认情况下,命名空间处理处于禁用状态。若禁用该功能,解析器在读取 XML 文件时不会进行命名空间处理。函数QDomNode::prefix()、QDomNode::localName() 和QDomNode::namespaceURI() 将返回一个空字符串。

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

仅由空格组成的文本节点将被移除,且不会出现在QDomDocument 中。自 Qt 6.5 起,可以将QDomDocument::ParseOption::PreserveSpacingOnlyNodes 作为解析选项传递,以指定必须保留仅包含空格的文本节点。

实体引用按以下方式处理:

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

注意: 如果 IOdevice 尚未打开,则其重载 将尝试以只读模式打开它。在这种情况下,调用方负责调用 close。此行为将在 Qt 7 中发生变化,届时将不再打开 IOdevice 。因此,应用程序应在调用setContent() 之前自行打开该设备。

这些函数是在 Qt 6.5 中引入的。

另请参阅 ParseResult 和ParseOptions 。

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)

将 `other ` 分配给此 DOM 文档。

复制的数据是共享的(浅拷贝):修改一个节点也会改变另一个节点。若要进行深拷贝,请使用cloneNode()。

© 2026 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.