Файл Qt XML - перестановка узлов

Я должен переставить узлы в файле XML. Для этого мне нужно скопировать узлы из QDomDocument другому QDomDocument,

Исходный файл XML имеет узлы в следующем порядке: -
0,1,2,3,4,5
Теперь я хочу расположить узлы в следующем порядке:---
0,2,4,1,3,5

1> У меня есть файл XML, который я читаю в QDomDocument (этот XML-файл имеет 6 узлов).
2> Теперь я пытаюсь скопировать QDomElement от одного QDomDocument и помещая их в другой QDomDocumentUpdated.
3> Затем я копирую обновленный QDomDocumentUpdated обратно в XML-файл.
4> После копирования узлов в обновленный XML-документ копируются только 3 узла.

Проблема, с которой я сталкиваюсь, не все узлы копируются в QDomDocumentUpdated, следовательно, xml-файл содержит меньшее количество узлов, чем добавлено мной.

Подскажите пожалуйста как это исправить.

Теперь, как мы видим, в документе XML есть 6 узлов. Исходный файл XML:---

<Animals>
 <Type>
  <Name>Lion</Name>
 </Type>
 <Type>
  <Name>Tiger</Name>
 </Type>
 <Type>
  <Name>Lepord</Name>
 </Type>
 <Type>
  <Name>Bear</Name>
 </Type>
 <Type>
  <Name>Wolf</Name>
 </Type>
 <Type>
  <Name>Camel</Name>
 </Type>
</Animals>

Файл исходного кода:----

QFile   xmlFile;
QTextStream xmlStream;
// xml dom document object
QDomDocument xmlDomDocument;
// xml dom document object
QDomDocument xmlDomDocumentSorted;
QTextStream xmlStream;
QDomNodeList listchildNodes;
QDomNode domNodeChild;
QDomElement xmlRoot;
// xml root for sorted xml
QDomElement xmlRootSorted;


//set the name of the file
xmlFile.setFileName("animals.xml");
xmlFile.open(QIODevice::ReadWrite|QIODevice::Text);
// Assign file to the stream
xmlStream.setDevice(&xmlFile);

xmlDomDocument.clear();
xmlDomDocument.setContent(&xmlFile);
// Make the root element
xmlRoot = xmlDomDocument.documentElement();
listchildNodes = xmlRoot.childNodes();


/****  Prepare Sorted list ****/
xmlDomDocumentSorted.clear();
// Make the root element
xmlRootSorted = xmlDomDocumentSorted.createElement("Animals");
// Add it to the document
xmlDomDocumentSorted.appendChild(xmlRootSorted);
// Append childs from original document
domNodeChild = listchildNodes.at(0);
xmlRootSorted.appendChild(domNodeChild);
domNodeChild = listchildNodes.at(2);
xmlRootSorted.appendChild(domNodeChild);
domNodeChild = listchildNodes.at(4);
xmlRootSorted.appendChild(domNodeChild);
domNodeChild = listchildNodes.at(1);
xmlRootSorted.appendChild(domNodeChild);
domNodeChild = listchildNodes.at(3);
xmlRootSorted.appendChild(domNodeChild);
domNodeChild = listchildNodes.at(5);
xmlRootSorted.appendChild(domNodeChild);

// Write the updated QDomDocument to XML file
///close file no flush
xmlFile.close();
//set the name of the file
xmlFile.setFileName(xmlFileName);
// open read & write mode
xmlFile.open(QIODevice::ReadWrite|QIODevice::Truncate|QIODevice::Text);
// Assign file to the stream
xmlStream.setDevice(&xmlFile);

// Write xml to the file
(xmlStream) << xmlDomDocumentSorted.toString();

// close the file
xmlFile.flush();
xmlFile.close();

Выходной XML-файл:---

<Animals>
 <Type>
  <Name>Lion</Name>
 </Type>
 <Type>
  <Name>Bear</Name>
 </Type>
 <Type>
  <Name>Lepord</Name>
 </Type>
</Animals>

Подскажите пожалуйста что не хватает?

1 ответ

Решение

Я только что проверил ваш код, чтобы увидеть, что на самом деле происходит. я использовал QString QDomDocument::toString ( int indent = 1 ) const отлаживать.

Я сделал что-то вроде этого:

domNodeChild = listchildNodes.at(0);
xmlRootSorted.appendChild(domNodeChild);

qDebug() << xmlDomDocumentSorted.toString(1);

domNodeChild = listchildNodes.at(2);
xmlRootSorted.appendChild(domNodeChild);

qDebug() << xmlDomDocumentSorted.toString(1);
...

и оказалось, у меня есть такой вывод:

Lion

Lion
Bear

Lion
Bear

Lion
Bear
Lepord
(x3)

Кажется, когда вы делаете это: domNodeChild = listchildNodes.at(x);Вы удаляете элемент из этого списка.

Давайте проверим документацию:

QDomNode &QDomNode::operator=(const QDomNode &n)

Назначает копию n этому узлу DOM.

Данные копии являются общими (мелкая копия): изменение одного узла также изменит другой. Если вы хотите сделать глубокую копию, используйте cloneNode().

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