我正在尝试替换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/

10-11 22:20