如何连接 QDomDocument::createElement 个调用?
How to concatenate QDomDocument::createElement calls?
我确实使用 QtXML 模块为 Qt 提供 "nice" 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:
有日期标签但没有文本节点内容
为什么不能连接这些调用?
我认为关键在下面这句话(Qt 文档):
The parsed XML is represented internally by a tree of objects that can
be accessed using the various QDom classes. All QDom classes only
reference objects in the internal tree. The internal objects in the DOM tree will get deleted once the last QDom object referencing them and the QDomDocument itself are deleted.
当您使用
创建本地对象时
QDomElement dateElement = doc.createElement("date");
dateElement
元素是内部树节点的引用。删除此对象将删除它引用的内部对象。它发生在以下调用中:
docTool.appendChild(doc.createElement("date1").appendChild(doc.createTextNode(dateString)));
其中由 doc.createElement("date1")
调用创建的临时对象在函数调用后立即被删除,因此引用的内部元素也被删除。
appendChild() returns 添加的节点。所以在:
docTool.appendChild(doc.createElement("date1").appendChild(doc.createTextNode(dateString)));
您最终尝试将文本节点附加到 date1 元素和 docTool 元素。这应该有效:
docTool.appendChild(doc.createElement("date1")).appendChild(doc.createTextNode(dateString));
我确实使用 QtXML 模块为 Qt 提供 "nice" 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:
有日期标签但没有文本节点内容
为什么不能连接这些调用?
我认为关键在下面这句话(Qt 文档):
The parsed XML is represented internally by a tree of objects that can be accessed using the various QDom classes. All QDom classes only reference objects in the internal tree. The internal objects in the DOM tree will get deleted once the last QDom object referencing them and the QDomDocument itself are deleted.
当您使用
创建本地对象时QDomElement dateElement = doc.createElement("date");
dateElement
元素是内部树节点的引用。删除此对象将删除它引用的内部对象。它发生在以下调用中:
docTool.appendChild(doc.createElement("date1").appendChild(doc.createTextNode(dateString)));
其中由 doc.createElement("date1")
调用创建的临时对象在函数调用后立即被删除,因此引用的内部元素也被删除。
appendChild() returns 添加的节点。所以在:
docTool.appendChild(doc.createElement("date1").appendChild(doc.createTextNode(dateString)));
您最终尝试将文本节点附加到 date1 元素和 docTool 元素。这应该有效:
docTool.appendChild(doc.createElement("date1")).appendChild(doc.createTextNode(dateString));