QDomDocument 类

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

头文件 #include <QDomDocument>
CMakefind_package(Qt6 REQUIRED COMPONENTS Xml)
target_link_libraries(mytarget PRIVATE Qt6::Xml)
qmakeQT += xml
继承 QDomNode

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

公共类型

(自 6.5) structParseResult
(自 6.5) enum classParseOption { Default, UseNamespaceProcessing, PreserveSpacingOnlyNodes }
flagsParseOptions

公共函数

QDomDocument()
QDomDocument(const QString &name)
QDomDocument(const QDomDocumentType &doctype)
QDomDocument(const QDomDocument &x)
~QDomDocument()
QDomAttrcreateAttribute(const QString &name)
QDomAttrcreateAttributeNS(const QString &nsURI, const QString &qName)
QDomCDATASectioncreateCDATASection(const QString &value)
QDomCommentcreateComment(const QString &value)
QDomDocumentFragmentcreateDocumentFragment()
QDomElementcreateElement(const QString &tagName)
QDomElementcreateElementNS(const QString &nsURI, const QString &qName)
QDomEntityReferencecreateEntityReference(const QString &name)
QDomProcessingInstructioncreateProcessingInstruction(const QString &target, const QString &data)
QDomTextcreateTextNode(const QString &value)
QDomDocumentTypedoctype() const
QDomElementdocumentElement() const
QDomElementelementById(const QString &elementId)
QDomNodeListelementsByTagName(const QString &tagname) const
QDomNodeListelementsByTagNameNS(const QString &nsURI, const QString &localName)
QDomImplementationimplementation() const
QDomNodeimportNode(const QDomNode &importedNode, bool deep)
QDomNode::NodeTypenodeType() const
(自6.5起) QDomDocument::ParseResultsetContent(const QByteArray &data, QDomDocument::ParseOptions options = ParseOption::Default)
(自6.5起) QDomDocument::ParseResultsetContent(QAnyStringView data, QDomDocument::ParseOptions options = ParseOption::Default)
(自6.5起) QDomDocument::ParseResultsetContent(QIODevice *device, QDomDocument::ParseOptions options = ParseOption::Default)
(自6.5起) QDomDocument::ParseResultsetContent(QXmlStreamReader *reader, QDomDocument::ParseOptions options = ParseOption::Default)
QByteArraytoByteArray(int indent = 1) const
QStringtoString(int indent = 1) const
QDomDocument &operator=(const QDomDocument &x)

详细介绍

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)的更多信息,请参阅文档对象模型(DOM)的第1级规范和2级核心规范。

另请参阅 DOM 书签应用

成员类型文档

[自6.5起] 枚举类 QDomDocument::ParseOption
标志 QDomDocument::ParseOptions

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

常数描述
QDomDocument::ParseOption::Default0x00没有设置解析选项。
QDomDocument::ParseOption::UseNamespaceProcessing0x01启用命名空间处理。
QDomDocument::ParseOption::PreserveSpacingOnlyNodes0x02只包含空白字符的文本节点被保留。

此枚举是在Qt 6.5中引入的。

ParseOptions类型是QFlags<ParseOption>的一个类型别名。它存储了一个OR组合的ParseOption值。

另请参阅 setContent

成员函数文档

[自6.5起] QDomDocument::ParseResult QDomDocument::setContent(QAnyStringView 数据, QDomDocument::ParseOptions 选项 = ParseOption::Default)

[自6.5起] QDomDocument::ParseResult QDomDocument::setContent(QIODevice *设备, QDomDocument::ParseOptions 选项 = ParseOption::Default)

[自6.5起] QDomDocument::ParseResult QDomDocument:: setContent(QXmlStreamReader *读取器, QDomDocument::ParseOptions 选项 = ParseOption::Default)

[自6.5起] QDomDocument::ParseResult QDomDocument::setContent(const QByteArray & 数据, QDomDocument::ParseOptions 选项 = ParseOption::Default)

该函数从字节数组 data、字符串视图 text、IO device 或流 reader 解析XML文档,并将其设置为文档的内容。它将尝试检测文档的编码,符合XML规范。在ParseResult中返回解析结果,该结果显式转换为bool

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

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

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

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

实体引用的处理方式如下

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

注意:接受IO device的重载将在它未打开的情况下尝试以只读模式打开它。在这种情况下,调用者负责调用close。这将改变Qt 7,它将不再打开IO device。因此,应用程序应在调用setContent()之前自己打开设备。

此函数是在Qt 6.5中引入的。

另请参阅 ParseResultParseOptions

QDomDocument::QDomDocument()

构建一个空文档。

[显式] QDomDocument::QDomDocument(const QString &name)

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

[显式] QDomDocument::QDomDocument(const QDomDocumentType &doctype)

创建一个带有文档类型doctype的文档。

另请参阅 QDomImplementation::createDocumentType

QDomDocument::QDomDocument(const QDomDocument &x)

构建x的副本。

副本数据是共享的(浅拷贝):修改一个节点也将更改另一个节点。如果您想创建一个深度副本,请使用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的元素,则此函数返回一个 空元素

由于QDomClasses不知道哪些属性是元素ID,所以此函数总是返回一个 空元素。这可能在未来的版本中更改。

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

返回一个包含文档中所有名称为tagname的元素的QDomNodeList。节点列表的顺序是在元素树的先序遍历中遇到的顺序。

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

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

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

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

QDomImplementation QDomDocument::implementation() const

返回一个QDomImplementation对象。

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

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

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

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

如果deep为true,则此函数不仅导入节点importedNode,还导入它的整个子树;如果它为false,则仅导入importedNode。对于QDomAttrQDomEntityReference节点,deep参数没有效果,因为QDomAttr节点的后代总是导入,而QDomEntityReference节点的后代永远不会导入。

此函数的行为根据节点类型略有不同

节点类型行为
QDomAttr将所有者元素设置为0并在生成的属性中设置指定的标志。无论何时对于属性节点,始终导入importedNode的整个子树:deep没有效果。
QDomDocument不能导入文档节点。
QDomDocumentFragment如果deep为true,则此函数导入整个文档片段;否则,它只会生成一个空的文档片段。
QDomDocumentType不能导入文档类型节点。
QDomElement也会导入那些QDomAttr::specified()为true的属性,其他属性不会导入。如果deep为true,此函数也导入importedNode的子树;否则,它只导入元素节点(以及一些属性,如上所述)。
QDomEntity可以导入实体节点,但目前由于DOM级别2中文档类型为只读,所以没有方法可以使用它们。
QDomEntityReference实体引用节点的后代永远不会导入:deep没有效果。
QDomNotation符号节点可以导入,但由于文档类型在DOM-level 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 &x)

x 赋值到此DOM文档。

副本数据是共享的(浅拷贝):修改一个节点也将更改另一个节点。如果您想创建一个深度副本,请使用cloneNode()。

© 2024 The Qt Company Ltd。此处包含的文档贡献权属于各自所有者。文档提供受GNU自由文档许可版本1.3许可,由自由软件基金会发布。Qt及其相应标志是芬兰和/或其他国家的The Qt Company Ltd.的商标。所有其他商标均为其各自所有者的财产。