我必须重新排列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
把它们放在另一个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}}
请提出遗漏的内容?
答案 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()。