Как объединить вызовы QDomDocument::createElement?

Я использую модуль QtXML, предоставляющий "хорошую" модель DOM для Qt.

Проблема, с которой я сталкиваюсь, заключается в том, что нельзя объединять вызовы, которые необходимы для создания дополнительных 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: имеет тег даты, но не содержит текстового узла

Почему нельзя объединить эти звонки?

2 ответа

Решение

appendChild() возвращает добавленный узел. Итак, в:

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

в итоге вы пытаетесь добавить текстовый узел как к элементу date1, так и к элементу docTool. Это должно работать:

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

Я думаю, что ключ находится в следующем предложении (Qt docs):

Разобранный XML представлен внутри дерева объектов, к которым можно получить доступ с помощью различных классов QDom. Все классы QDom только ссылаются на объекты во внутреннем дереве. Внутренние объекты в дереве DOM будут удалены после того, как последний объект QDom, ссылающийся на них, и сам QDomDocument будут удалены.

Когда вы создаете локальный объект с

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

dateElement Элемент является ссылкой на внутренний узел дерева. Удаление этого объекта приведет к удалению внутреннего объекта, на который он ссылается. Это происходит в следующем вызове:

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

где временный объект, созданный doc.createElement("date1") вызов удаляется, как только вызывается функция, таким образом, указанный внутренний элемент также удаляется.

Другие вопросы по тегам