QDomDocument 类表示 XML 文档。 更多...
头: | #include <QDomDocument> |
qmake: | QT += xml |
继承: | QDomNode |
注意: 此类的所有函数 可重入 .
QDomDocument (const QDomDocument & x ) | |
QDomDocument (const QDomDocumentType & doctype ) | |
QDomDocument (const QString & name ) | |
QDomDocument () | |
QDomDocument & | operator= (const QDomDocument & x ) |
~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 | 实现 () const |
QDomNode | importNode (const QDomNode & importedNode , bool deep ) |
QDomNode::NodeType | nodeType () const |
bool | setContent (const QByteArray & data , bool namespaceProcessing , QString * errorMsg = nullptr, int * errorLine = nullptr, int * errorColumn = nullptr) |
bool | setContent (const QString & text , bool namespaceProcessing , QString * errorMsg = nullptr, int * errorLine = nullptr, int * errorColumn = nullptr) |
bool | setContent (QIODevice * dev , bool namespaceProcessing , QString * errorMsg = nullptr, int * errorLine = nullptr, int * errorColumn = nullptr) |
bool | setContent (const QByteArray & buffer , QString * errorMsg = nullptr, int * errorLine = nullptr, int * errorColumn = nullptr) |
bool | setContent (const QString & text , QString * errorMsg = nullptr, int * errorLine = nullptr, int * errorColumn = nullptr) |
bool | setContent (QXmlStreamReader * reader , bool namespaceProcessing , QString * errorMsg = nullptr, int * errorLine = nullptr, int * errorColumn = nullptr) |
QByteArray | toByteArray (int indent = 1) const |
QString | toString (int indent = 1) const |
QDomDocument 类表示整个 XML 文档。从概念上讲,它是文档树的根,并提供对文档数据的首要访问。
由于元素、文本节点、注释、处理指令、等不能存在于文档上下文之外,因此文档类还包含创建这些对象所需的工厂函数。创建的节点对象拥有 ownerDocument () 函数将它们与在其中创建它们的上下文文档关联。最常用的 DOM 类是 QDomNode , QDomDocument, QDomElement and QDomText .
经剖析的 XML 通过对象树在内部表示,可以使用各种 QDom 类访问它们。所有 QDom 类只 reference 在内部树中的对象。一旦最后引用它们的 QDom 对象或 QDomDocument 本身被删除,内部 DOM 树对象也将被删除。
元素、文本节点、等的创建是使用此类中提供的各种工厂函数完成的。使用 QDom 类默认构造函数只会导致无法操纵或插入文档的空对象。
QDomDocument 类拥有创建文档数据的几个函数,例如: createElement (), createTextNode (), createComment (), createCDATASection (), createProcessingInstruction (), createAttribute () 和 createEntityReference ()。其中某些函数拥有支持名称空间的版本,即 createElementNS () 和 createAttributeNS ()。 createDocumentFragment () 函数用于保持文档部分;这对操纵复杂文档很有用。
整个文档内容的设置采用 setContent ()。此函数剖析作为 XML 文档传递的字符串,并创建表示文档的 DOM 树。根元素是可用的使用 documentElement ()。可以获得文档的正文表示使用 toString ().
注意: DOM 树可能最终预留大量内存,若 XML 文档很大。对于此类文档, QXmlStreamReader 或 QXmlQuery 类可能是更好的解决方案。
它是可能的,将来自另一文档的节点插入文档使用 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()) << Qt::endl; // 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
and
elem
超出作用域,表示 XML 文档的整个内部树就会被删除。
要使用 DOM 创建文档,所用代码像这样:
QDomDocument doc("MyML"); 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 and 级别 2 核心 规范。
另请参阅 DOM 书签范例 and 简单 DOM 模型范例 .
构造副本为 x .
拷贝数据是共享的 (浅拷贝):修改一个节点也将改变另一节点。若想要制作深度副本,使用 cloneNode ().
创建文档采用文档类型 doctype .
另请参阅 QDomImplementation::createDocumentType ().
创建文档并将文档类型名称设为 name .
构造空文档。
赋值 x 到此 DOM (文档对象模型) 文档。
拷贝数据是共享的 (浅拷贝):修改一个节点也将改变另一节点。若想要制作深度副本,使用 cloneNode ().
销毁对象并释放其资源。
创建新属性称为 name 可以插入元素,如:使用 QDomElement::setAttributeNode ().
若 name 不是有效 XML 名称,此函数的行为被支配由 QDomImplementation::InvalidDataPolicy .
另请参阅 createAttributeNS ().
创建具有名称空间支持,可以插入元素的新属性。属性名称为 qName 和名称空间 URI (统一资源标识符) 为 nsURI 。此特征还设置 QDomNode::prefix () 和 QDomNode::localName () 为适当值 (从属 qName ).
若 qName 不是有效 XML 名称,此函数的行为被支配由 QDomImplementation::InvalidDataPolicy .
另请参阅 createAttribute ().
创建新 CDATA 区间为字符串 value 可以插入文档,如:使用 QDomNode::appendChild ().
若 value 包含无法存储在 CDATA 区间的字符,此函数的行为被支配由 QDomImplementation::InvalidDataPolicy .
另请参阅 QDomNode::appendChild (), QDomNode::insertBefore (),和 QDomNode::insertAfter ().
创建的新注释为字符串 value 可以插入文档,如:使用 QDomNode::appendChild ().
若 value 包含无法存储于 XML 注释中的字符,此函数的行为被支配由 QDomImplementation::InvalidDataPolicy .
另请参阅 QDomNode::appendChild (), QDomNode::insertBefore (),和 QDomNode::insertAfter ().
创建新的文档片段,可以用于保持文档的一部分,如:当对文档树做复杂操纵时。
创建的新元素称为 tagName 可以插入 DOM 树,如:使用 QDomNode::appendChild ().
若 tagName 不是有效 XML 名称,此函数的行为被支配由 QDomImplementation::InvalidDataPolicy .
另请参阅 createElementNS (), QDomNode::appendChild (), QDomNode::insertBefore (),和 QDomNode::insertAfter ().
创建具有名称空间支持的新元素,可以插入 DOM 树。元素的名称为 qName 和名称空间 URI (统一资源标识符) 为 nsURI 。此特征还设置 QDomNode::prefix () 和 QDomNode::localName () 为适当值 (从属 qName ).
若 qName 为空字符串,返回 null 元素不管无效数据策略是否有设置。
另请参阅 createElement ().
创建新实体引用称为 name 可以插入文档,如:使用 QDomNode::appendChild ().
若 name 不是有效 XML 名称,此函数的行为被支配由 QDomImplementation::InvalidDataPolicy .
另请参阅 QDomNode::appendChild (), QDomNode::insertBefore (),和 QDomNode::insertAfter ().
创建可以插入文档的新处理指令,如:使用 QDomNode::appendChild ()。此函数将处理指令目标设为 target 和数据到 data .
若 target 不是有效 XML 名称,或数据若包含不可以出现在处理指令中的字符,此函数的行为被支配由 QDomImplementation::InvalidDataPolicy .
另请参阅 QDomNode::appendChild (), QDomNode::insertBefore (),和 QDomNode::insertAfter ().
创建文本节点为字符串 value 可以插入文档树,如:使用 QDomNode::appendChild ().
若 value 包含不可以作为 XML 文档字符数据存储的字符 (即使按字符引用形式),此函数的行为被支配由 QDomImplementation::InvalidDataPolicy .
另请参阅 QDomNode::appendChild (), QDomNode::insertBefore (),和 QDomNode::insertAfter ().
返回此文档的文档类型。
返回文档的根元素。
返回的元素 ID 等于 elementId 。若未找到具有 ID 的元素,此函数返回 null 元素 .
由于 QDomClasses 不知道哪些属性是元素 ID,所以此函数始终返回 null 元素 。这在未来版本中可能改变。
返回 QDomNodeList ,包含文档中的所有元素具有名称 tagname 。节点列表次序是以预顺序遍历元素树时遇到它们的次序。
另请参阅 elementsByTagNameNS () 和 QDomElement::elementsByTagName ().
返回 QDomNodeList ,包含文档中的所有元素具有本地名称 localName 和名称空间 URI (统一资源标识符) 为 nsURI 。节点列表次序是以预顺序遍历元素树时遇到它们的次序。
另请参阅 elementsByTagName () 和 QDomElement::elementsByTagNameNS ().
返回 QDomImplementation 对象。
导入节点 importedNode 从另一文档到此文档。 importedNode 仍然在原文档中;此函数创建可在此文档中使用的副本。
此函数返回属于此文档的导入节点。返回节点没有父级。它是不可能的去导入 QDomDocument and QDomDocumentType 节点。在那些情况下,此函数返回 null 节点 .
若 importedNode 是 null 节点 ,返回空节点。
若 deep 为 True,此函数不仅导入节点 importedNode 及其整个子树;若它为 false,仅 importedNode 被导入。自变量 deep 不影响 QDomAttr and QDomEntityReference 节点,因为后代的 QDomAttr 节点始终被导入而那些 QDomEntityReference 节点从不被导入。
此函数行为稍有不同,根据节点类型:
节点类型 | 行为 |
---|---|
QDomAttr | owner 元素被设为 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 ().
返回
DocumentNode
.
此函数剖析 XML 文档从字节数组 data 并将它设为文档内容。它试着按 XML 规范要求检测文档编码。
若 namespaceProcessing 为 true,剖析器识别 XML 文件中的名称空间并将前缀名称、本地名称和名称空间 URI 设为适当值。若 namespaceProcessing 为 false,剖析器不处理名称空间当它读取 XML 文件时。
若发生剖析错误,此函数返回
false
且错误消息放置于
*
errorMsg
,行号在
*
errorLine
和列号在
*
errorColumn
(除非关联指针被设为 0);否则此函数返回
true
。在 QXmlParseException 类文档编制中有描述各种错误消息。注意:若想要向应用程序用户显示这些错误消息,将以英文显示它们除非它们被明确翻译。
若 namespaceProcessing 为 true,函数 QDomNode::prefix () 返回所有元素和属性的字符串。它返回空字符串,若元素或属性没有前缀。
仅剥离由空白组成的文本节点,且不会出现在 QDomDocument 。若不期望此行为,可以使用 setContent() 重载以允许 QXmlReader 提供。
若 namespaceProcessing 为 false,函数 QDomNode::prefix (), QDomNode::localName () 和 QDomNode::namespaceURI () 返回空字符串。
实体引用处理如下:
另请参阅 QDomNode::namespaceURI (), QDomNode::localName (), QDomNode::prefix (), QString::isNull (),和 QString::isEmpty ().
这是重载函数。
此函数读取 XML 文档从字符串
text
,返回 true 若内容被成功剖析;否则返回
false
。由于
text
已经是 Unicode 字符串,不用做编码检测。
这是重载函数。
此函数读取 XML 文档从 IO 设备
dev
,返回 true 若内容被成功剖析;否则返回
false
.
这是重载函数。
此函数读取 XML 文档从字节数组 buffer ,返回 true 若内容被成功剖析;否则返回 false。
不履行名称空间处理。
这是重载函数。
此函数读取 XML 文档从字符串
text
,返回 true 若内容被成功剖析;否则返回
false
。由于
text
已经是 Unicode 字符串,不用履行编码检测。
也不履行名称空间处理。
这是重载函数。
此函数读取 XML 文档从
QXmlStreamReader
reader
并剖析它。返回
true
若内容被成功解析;否则返回
false
.
若
namespaceProcessing
is
true
,剖析器识别 XML 文件中的名称空间并将前缀名称、本地名称和名称空间 URI 设为适当值。若
namespaceProcessing
is
false
,剖析器不处理名称空间当它读取 XML 文件时。
若发生剖析错误,错误消息放置在
*
errorMsg
,行号在
*
errorLine
和列号在
*
errorColumn
(除非关联指针被设为 0)。
该函数在 Qt 5.15 引入。
另请参阅 QXmlStreamReader .
将经剖析文档转换回其正文表示并返回 QByteArray 包含编码为 UTF-8 的数据。
此函数使用 indent 作为缩进子元素的空格数量。
另请参阅 toString ().
将经剖析文档转换回其正文表示。
此函数使用 indent 作为缩进子元素的空格数量。
若 indent 为 -1,根本不添加空白。