Мне нужно удалить вложенный многоуровневый (неизвестная глубина) тег из файла XML с помощью QDomDocument. Как правильно это сделать?
Вот пример файла 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>
"