Файл 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().