如何连接QDomDocument :: createElement调用?

时间:2015-01-21 09:35:59

标签: qt qtxml qdomdocument

我确实使用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:具有日期标记但没有textnode内容

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

我认为关键在于以下句子(Qt docs):

  

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

使用

创建本地对象时
QDomElement dateElement = doc.createElement("date");

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

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

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