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

testout.xml

<?xml version="1.0" encoding="UTF-8"?>
<A>
    <B/>
</A>

main.cpp

#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;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp

ビルドして実行

qmake && make && ./main

QtXml

この単純なタスクに引き続き使用する場合はQtXml、次のようにすることができます。

main.cpp

#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;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core xml
SOURCES += main.cpp

ビルドして実行

qmake && make && ./main

出力

"<A>
 <B/>
</A>
"
于 2014-12-23T05:54:04.677 に答える