C++ 如何使用QDomDocument从XML文档中删除嵌套标记

C++ 如何使用QDomDocument从XML文档中删除嵌套标记,c++,qt,qtcore,qtxml,qdomdocument,C++,Qt,Qtcore,Qtxml,Qdomdocument,我需要使用QDomDocument从XML文件中删除嵌套的多级未知深度标记。这样做的正确方式是什么? 下面是一个XML文件示例 ............................. 我甚至不会使用QDomDocument,又名。在QtCore中使用QtXml作为流读取器和写入器类相对简单。我的解决方案可以进一步扩展,以支持其他方面: QtCore testin.xml 构建并运行 QtXml 如果您仍然坚持使用QtXml完成此简单任务,您可以这样做: main.cpp 构建并运行 输出 我

我需要使用QDomDocument从XML文件中删除嵌套的多级未知深度标记。这样做的正确方式是什么? 下面是一个XML文件示例

............................. 我甚至不会使用QDomDocument,又名。在QtCore中使用QtXml作为流读取器和写入器类相对简单。我的解决方案可以进一步扩展,以支持其他方面:

QtCore testin.xml 构建并运行 QtXml 如果您仍然坚持使用QtXml完成此简单任务,您可以这样做:

main.cpp 构建并运行 输出
我想我应该在QDomDocument中包含我必须这么做的内容,因为这只是另一个已经使用QDomDocument实现的项目的一部分。你可以用两行代码给出答案,而不用对我大喊大叫。您必须使用父节点removeChild成员函数删除子节点。在使用根元素removeChild函数之前,我一直在尝试这样做。谢谢你给我指明了正确的方向。您不必给出构建命令。我说我已经实施了项目的一部分,对吧?@Madushan:这不全是关于你的。答案也是为你问题的未来读者准备的。也提交了一份QDomDocument解决方案。圣诞快乐!
<A>
  <B>
    <C>
      .............................
    </C>
  </B>
</A>
<?xml version="1.0" encoding="UTF-8"?>
<A>
    <B/>
</A>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
#include <QDebug>
#include <QString>
#include <QFile>

int main()
{
    QFile inputFile("testin.xml");
    if (!inputFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "File open error:" << inputFile.errorString();
        return 1;
    }
    QFile outputFile("testout.xml");
    if (!outputFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qDebug() << "File open error:" << outputFile.errorString();
        return 1;
    }
    QXmlStreamReader inputStream(&inputFile);
    QXmlStreamWriter outputStream(&outputFile);
    outputStream.setAutoFormatting(true);
    outputStream.writeStartDocument();
    bool ignore = false;
    static const QString searchString = "C";
    while (!inputStream.atEnd() && !inputStream.hasError())
    {
        inputStream.readNext();
        if (inputStream.isStartElement()) {
            QString name = inputStream.name().toString();
            if (name != searchString && !ignore)
                outputStream.writeStartElement(name);
            else
                ignore = true;
        } else if (inputStream.isEndElement()) {
            if (!ignore)
                outputStream.writeEndElement();
            if (inputStream.name().toString() == searchString)
                ignore = false;
        }
    }
    outputStream.writeEndDocument();
    return 0;
}
TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp
qmake && make && ./main
#include <QDomDocument>
#include <QDomNode>
#include <QDomElement>
#include <QFile>
#include <QDebug>

int main()
{
    QFile inputFile("testin.xml");
    if (!inputFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "File open error:" << inputFile.errorString();
        return 1;
    }

    QDomDocument doc;
    doc.setContent(&inputFile);
    QDomNode searchNode = doc.elementsByTagName("C").item(0);
    QDomNode parentNode = searchNode.parentNode();
    parentNode.removeChild(searchNode);
    qDebug() << doc.toString();
    return 0;
}
TEMPLATE = app
TARGET = main
QT = core xml
SOURCES += main.cpp
qmake && make && ./main
"<A>
 <B/>
</A>
"