我正在尝试替换xml树的节点:
QFile file("xml1.xml");
file.open(QFile::ReadOnly);
QDomDocument xml;
xml.setContent(file.readAll());
QDomElement root = xml.documentElement();
QDomElement child = searchNode(root, "Timeout");
QDomElement newChild = xml.createElement("Timeout");
QDomText newNodeText = xml.createTextNode(QString("New Text"));
newChild.appendChild(newNodeText);
root.replaceChild(newChild, child);
但是什么也没发生。 child不为null,root包含所有xml字段。
root.firstChildElement(“Timeout”)也会返回null。
函数searchNode:
QDomElement MainWindow::searchNode(const QDomElement& root, const QString& nodeName) {
QDomElement returning = QDomElement();
if (!root.firstChild().nodeValue().isEmpty()) {
if (root.tagName() == nodeName) {
returning = root;
}
}
if (returning.isNull()) {
for (auto element = root.firstChildElement(); !element.isNull(); element = element.nextSiblingElement()) {
returning = searchNode(element, nodeName);
if (!returning.isNull()) {
break;
}
}
}
return returning;
}
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Envelope>
<SOAP-ENV:Header>
<wsa:Action>action</wsa:Action>
<wsa:To> ADDRESS </wsa:To>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<PullMessages>
<Timeout>PT2S</Timeout>
<MessageLimit>1</MessageLimit>
</PullMessages>
</SOAP-ENV:Body>
</Envelope>
怎么了?
最佳答案
Timeout
不是Envelope
(代码中的可变root
)的子代。它是PullMessages
的子级。因此,root.firstChildElement("Timeout")
应该返回一个空节点。这也解释了为什么root.replaceChild(newChild, child);
无法正常工作。
QDomNode::replaceChild
:
用newChild替换oldChild。 oldChild必须是该节点的直接子代。
要使其正常工作,您可以执行以下操作:oldChild.parentNode().replaceChild(newChild, oldChild);
关于c++ - QT ReplaceChild方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51722667/