StupidBeauty
Read times:1720Posted at: - no title specified

Qt5.4文档翻译:QDomDocument,QDomDocument Class

QDomDocument 类代表着一个XML 文档。 详细说明……

头文件:

#include <QDomDocument>

qmake指令

QT += xml

继承

QDomNode

注意 这个类中的函数都是 可重入的 ,例外 setContent () ,它是不可重入的。

详细说明

QDomDocument 类代表着一个XML 文档。

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 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();

// 输出最外层元素的所有直接子代元素的名字。

QDomElement docElem = doc. documentElement ();

QDomNode n = docElem. firstChild ();

while(!n.isNull()) {

QDomElement e = n.toElement(); // 尝试 将该节点转换为一个元素。

if(!e.isNull()) {

cout << qPrintable (e.tagName()) << endl; // 该节点确实是一个元素。

}

n = n.nextSibling();

}

// 将一个新元素追加到文档的末尾

QDomElement elem = doc. createElement ("img");

elem.setAttribute("src", "myimage.png");

docElem. appendChild (elem);

一旦 doc 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 ();

欲知更多关于文档对象模型(Document Object Model)的信息, 则阅读文档对象模型(Document Object Model (DOM)) 级别1 级别2核心 规范。

参考 DOM书签示例 简单DOM模型示例

成员函数文档

bool  QDomDocument:: setContent (const  QByteArray  &  data bool namespaceProcessing QString  *  errorMsg  = 0, int  *  errorLine  = 0,  int  *  errorColumn  = 0)

这个函数,会对来自于字节数组 data 的XML 文档进行解析,并且将它设置为文档的内容。它会尝试按照XML 规范的要求来检测文档的编码。

如果namespaceProcessing 为真(true),则,解析器会识别XML 文件中的命名空间,并且将前缀名字、本地名字和命名空间URI 设置为适当的值。如果 namespaceProcessing 为假(false),则,解析器不会在读取XML 文件时进行命名空间处理。

如果解析过程 中出现错误,则, 这个函数会返回假( false ),并且 ,错误信息 会放置在 * errorMsg 中,错误处的行号会放置在 * errorLine 中,列号会放置在 * errorColumn 中(除非相应 的指针被设置为 0);否则 ,此函数会返回真( true )。 QXmlParseException 类的文档中说明了各种各样的错误消息。注意 ,如果 妳想要将这些错误消息显示在用户看的话,它们会被显示为英文的,除非妳明确地翻译它们。

如果 namespaceProcessing 为真(true),则, QDomNode::prefix ()这个函数会针对所有的元素和属性返回一个字符串。如果 该元素或属性没有前缀,则,会返回一个空白的字符串。

对于那些 只由空白字符组成的文本节点,它们 会被裁剪 ,并且不会出现在 QDomDocument 中。如果 妳无法接受这个行为,那么, 妳可以使用重载的以 QXmlReader 为参数的setContent()函数。

如果 namespaceProcessing 为假(false),则, QDomNode::prefix () QDomNode::localName ()和 QDomNode::namespaceURI ()函数会返回空白字符串。

引用是按照以下方式来处理的:

  • •. 对于内容 中出现的 内部 的通用实体和字符实体的引用,会被包含。结果 将是一个 QDomText 节点, 其引用内容会替换为对应的实体的值。

  • •. 对于内部子集 中出现的参数实体的引用,会被包含。结果 将是一个 QDomDocumentType 节点,其中包含 着实体 和标记声明,并且 其引用内容会替换为对应的实体的值。

  • •. 任何 一个通用的被解析的实体引用,如果它不是被定义在内部子集中,并且又在内容中出现了,那么,会使用一个 QDomEntityReference 节点来表示。

  • •.任何一个解析出来的实体引用,如果它不是被定义在内部子集中,并且不在内容中出现,那么,其内容会被一个空白字符串替换。

  • •.任何一个未能被解析的实体引用,会被替换为空白字符串。

警告: 这个函数是 不可重入的

参考 QDomNode::namespaceURI () QDomNode::localName () QDomNode::prefix () QString::isNull () QString::isEmpty ()

bool  QDomDocument:: setContent (const  QString  &  text bool namespaceProcessing QString  *  errorMsg  = 0,  int  * errorLine  = 0,  int  *  errorColumn  = 0)

这是一个重载函数。

这个函数会从字符串 text 中读取XML 文档,如果内容被成功解析,则返回真(true);否则返回 假( false )。由于 text 已经 是一个Unicode 字符串,所以,不会进行编码检测。

bool  QDomDocument:: setContent (const  QString  &  text QString  *  errorMsg  = 0,  int  *  errorLine  = 0,  int  * errorColumn  = 0)

这是一个重载函数。

这个函数会从字符串 text 中读取XML 文档,如果内容被成功解析,则返回真(true);否则返回 假( false )。由于 text 已经 是一个Unicode 字符串,所以,不会进行编码检测。

不会进行命名空间处理。

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

将解析到的文档重新转换为其文本表示形式。

这个函数,会使用 indent 个空格来对子元素进行缩进。

如果indent 为-1,则,不会添加空格。

巧慧

八福晋

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands