如何连接 QDomDocument::createElement 调用



我确实使用QtXML模块为Qt提供了一个"不错的"DOM模型。

我遇到的问题是,无法连接调用,使调用需要创建额外的QDomElement变量进行追加。有没有办法解决这个问题?

QDomDocument doc;
QDomProcessingInstruction xmlVers = doc.createProcessingInstruction("xml","version="1.0" encoding='utf-8'");
doc.appendChild(xmlVers);
QDomElement docTool = doc.createElement("tool");
doc.appendChild(docTool);
QDateTime t = QDateTime::currentDateTime();
QString dateString = t.toString("yyyy-MM-ddTHH:mm:ss");
// 0: Correct implementation requiring extra QDomElement dateElement
QDomElement dateElement = doc.createElement("date");
dateElement.appendChild(doc.createTextNode(dateString));
docTool.appendChild(dateElement);
// 1: Concatenating create* calls without extra variable
docTool.appendChild(doc.createElement("date1").appendChild(doc.createTextNode(dateString)));
// 2: Trying to encapsulate createElement call by brackets
docTool.appendChild((((QDomElement)doc.createElement("date2")).appendChild(doc.createTextNode(dateString))));
// 3: Trying to hit the nail by elementById (Broken per documentation?!)    
docTool.appendChild(doc.createElement("date3"));
doc.elementById("date3").appendChild(doc.createTextNode(dateString));
ui->textBrowser->append(doc.toString());

给出非常奇怪的结果:

<?xml version="1.0" encoding='utf-8'?>
<tool>
 <date>2015-01-21T10:33:56</date>2015-01-21T10:33:562015-01-21T10:33:56<date3/>
</tool>

正如我们所看到的 0:是正确的 1:根本没有日期标签 2:和以前一样 3:有日期标签但没有文本节点内容

为什么不能连接这些调用?

appendChild() 返回已添加的节点。 所以在:

docTool.appendChild(doc.createElement("date1").appendChild(doc.createTextNode(dateString)));

您最终会尝试将文本节点附加到 Date1 元素和 docTool 元素。 这应该有效:

docTool.appendChild(doc.createElement("date1")).appendChild(doc.createTextNode(dateString));

我认为关键在下面的句子中(Qt文档):

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

创建

本地对象时

QDomElement dateElement = doc.createElement("date");

dateElement 元素是内部树节点的引用。删除此对象将删除它引用的内部对象。它发生在以下调用中:

docTool.appendChild(doc.createElement("date1").appendChild(doc.createTextNode(dateString)));

其中,doc.createElement("date1")调用创建的临时对象在函数调用后立即被删除,因此引用的内部元素也会被删除。

最新更新