gpt4 book ai didi

c++ - QT ReplaceChild 方法

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:47 24 4
gpt4 key购买 nike

我正在尝试替换 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 不为空,root 包含所有 xml 字段。root.firstChildElement("Timeout") 也返回 null。函数搜索节点:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com