Qt XML文件 - 重新排列节点

时间:2014-08-01 05:38:45

标签: xml qt qtxml

我必须重新排列XML文件中的节点。为此,我需要将节点从QDomDocument复制到另一个QDomDocument

原始xml文件按此顺序包含节点: -
0,1,2,3,4,5
现在我想按顺序排列节点:---
0,2,4,1,3,5

1>我有一个XML文件,我正在QDomDocument中阅读(此xml文件有6个节点) 2 - ;现在我正在尝试从QDomElementQDomDocument复制QDomDocumentUpdated把它们放在另一个QDomDocumentUpdated中 3 GT;然后我将更新后的QDomDocumentUpdated复制回xml文件 4>复制节点后,只有3个节点被复制到更新的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> 。因此,xml文件包含的节点数量少于我附加的节点数。

请建议如何纠正。

现在我们可以看到XML文档中有6个节点。原始XML文件:---

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();

源代码文件:----

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

输出XML文件:---

{{1}}

请提出遗漏的内容?

1 个答案:

答案 0 :(得分:2)

我刚刚测试了你的代码,看看到底发生了什么。我使用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()。