-8

我需要使用 QDomDocument 从 XML 文件中删除嵌套的多级(未知深度)标签。这样做的正确方法是什么?这是 XML 文件的示例

<A>
  <B>
    <C>
      .............................
    </C>
  </B>
</A>
4

1 回答 1

4

我什至不会使用QDomDocument,又名。QtXml因为流读取器和写入器类在 QtCore 中使用起来相对简单。这是我的解决方案,可以进一步扩展以支持其他事情:

QtCore

testin.xml

<A>
  <B>
    <C>
      .............................
    </C>
  </B>
</A>

测试输出.xml

<?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

QtXml

如果你仍然坚持使用QtXml这个简单的任务,你可以这样做:

主文件

#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>
"
于 2014-12-23T05:54:04.677 回答