QDomDocument を使用して、ネストされたマルチレベル (深さ不明) タグを XML ファイルから削除する必要があります。これを行う適切な方法は何ですか?XML ファイルのサンプルを次に示します。
<A>
<B>
<C>
.............................
</C>
</B>
</A>
QDomDocument を使用して、ネストされたマルチレベル (深さ不明) タグを XML ファイルから削除する必要があります。これを行う適切な方法は何ですか?XML ファイルのサンプルを次に示します。
<A>
<B>
<C>
.............................
</C>
</B>
</A>
QDomDocument
、別名も使用しません。QtXml
これは、ストリーム リーダーとライター クラスが QtCore で使用するのが比較的簡単であるためです。これは、他のこともサポートするためにさらに拡張できる私のソリューションです。
<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
この単純なタスクに引き続き使用する場合は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>
"