Как удалить вложенный тег из XML-документа с помощью QDomDocument

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

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

-8

Решение

Я бы даже не использовал QDomDocumentака. QtXml для этого, поскольку классы чтения и записи потоков относительно просты в использовании в 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 для этой простой задачи вы могли бы сделать это:

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

Другие решения


По вопросам рекламы [email protected]