我正在开发一个QT项目,其中一部分是重建XML文件。我能够使用QDom进行大部分所需的更改,但我无法找到如何重命名节点。
所以旧的XML文件看起来像..
<root>
<window name="" ..>
<element x="" y=""/>
<element1 a="" b=""/>
...
</window>
..
..
<window name="">
<element x="" y=""/>
<element1 a="" b=""/>
...
</window>
</root>
我如何更改XML以使新的XML具有&lt;组&gt;而不是&lt;窗口&gt;?
所以最后它需要看起来像..
<root>
<group name="" ..>
<element x="" y=""/>
<element1 a="" b=""/>
...
</group>
..
..
<group name="">
<element x="" y=""/>
<element1 a="" b=""/>
...
</group>
</root>
添加更多信息...
以下是我用来读取<window>
节点的代码,根据可见性删除一些(来自列表),我需要将剩余节点的<window>
更改为<group>
。 / p>
QFile oldXml("file.xml");
oldXml.open(QIODevice::ReadOnly);
QDomDocument doc;
doc.setContent(&oldXml);
QDomNodeList nodes = doc.elementsByTagName("window");
// Remove Window nodes based on visibility
insize = nodes.length();
for ( int i = 0; i < insize; i++ ) {
QDomNode node = nodes.at(i-dels);
if ( (list2[i] == "0") | (list2[i]=="") ) {
node.parentNode().removeChild(node);
dels=dels+1;
} else {
// Here is where i need to change the node name from <window> to e.g. <group>
}
}
答案 0 :(得分:0)
我没有看到任何直接的API函数来重命名该元素。 API允许更改值,但不允许更改名称。
还有另一轮谈判。
创建一个元素,例如:
QDomElement group = doc.createElement("group");
使用“QDomNode的替换子”功能。
QDomNode QDomNode::replaceChild(const QDomNode &newChild, const QDomNode &oldChild)
例如:
QDomNode dNode = node.replaceChild(group,oldNode);
答案 1 :(得分:0)
如果要为setTagName
属性设置值,可以使用setAttribute
和name
。
通过以下示例,myxml.xml
转换为xmlout.xml
<强> myxml.xml 强>
<root>
<window name="">
<element x="" y=""/>
<element1 a="" b=""/>
</window>
<window name="">
<element x="" y=""/>
<element1 a="" b=""/>
</window>
</root>
<强> xmlout.xml 强>
<root>
<group name="value">
<element y="" x=""/>
<element1 a="" b=""/>
</group>
<window name="">
<element y="" x=""/>
<element1 a="" b=""/>
</window>
</root>
<强>的main.cpp 强>
#include <iostream>
#include <QtXml>
#include <QFile>
int main(int argc, char *argv[])
{
QDomDocument doc;
// Load xml file as raw data
QFile inFile(":myxml.xml");
if (!inFile.open(QIODevice::ReadOnly ))
{
std::cerr << "Error - inFile: " << inFile.errorString().toStdString();
return 1;
}
// Set data into the QDomDocument before processing
doc.setContent(&inFile);
// Get element in question
QDomElement root = doc.documentElement();
QDomElement nodeTag = root.firstChildElement("window");
nodeTag.setTagName("group");
nodeTag.setAttribute("name","value");
inFile.close();
// Save the modified data
QFile outFile("xmlout.xml");
if (!outFile.open(QIODevice::WriteOnly ))
{
// Error while loading file
std::cerr << "Error - outFile: " << outFile.errorString().toStdString();
return 1;
}
QTextStream stream;
stream.setDevice(&outFile);
stream.setCodec("UTF-8");
doc.save(stream,4);
outFile.close();
return 0;
}