моя проблема в том,
У меня есть большой файл в стиле XML, представленный как QDomDocument
и мне нужно получить доступ к определенным тегам в нескольких местах в XML
Мой XML выглядит так
<Mat1>
<Name>Mat_1</Name>
<Properties>
<Size>10</Size>
<SizeMod>G</SizeMod>
</Properties>
</Mat1>
<Mat2>
<Name>Mat_2</Name>
<Properties>
<Size>15</Size>
<SizeMod>k</SizeMod>
</Properties>
</Mat2>
И мне нужно получить доступ ко всем вхождениям «SizeMod» и «Size». Проблема в том, что формат файла может регулярно меняться в будущем, и я хочу, чтобы мой код соответствовал всем версиям файла.
В данный момент я просто перебираю все дочерние узлы с несколькими циклами for, пока не достигну необходимой глубины, а затем проверяю с помощью оператора if, нахожусь ли я в нужном узле.
Но это кажется плохим способом сделать это.
Как прокомментировал @hank, вы должны использовать QDomDocument::elementsByTagName(const QString &tagname)
чтобы получить элементы
в документе с именем tagname
,
Затем итерируйте по узлам, чтобы получить QDomNode
, Наконец, преобразовать QDomNode
в QDomElement
,
Пример, где мы печатаем текст элемента и имя тега:
#include <QtXml>
#include <QtCore>
int main()
{
QFile file(":/myxml.xml");
file.open(QFile::ReadOnly|QFile::Text);
QDomDocument dom;
QString error;
int line, column;
if(!dom.setContent(&file, &error, &line, &column)) {
qDebug() << "Error:" << error << "in line " << line << "column" << column;
return -1;
}
QDomNodeList nodes = dom.elementsByTagName("Size");
for(int i = 0; i < nodes.count(); i++)
{
QDomNode elm = nodes.at(i);
if(elm.isElement())
{
qDebug() << elm.toElement().tagName()
<< " = "<< elm.toElement().text();
}
}
nodes = dom.elementsByTagName("SizeMod");
for(int i = 0; i < nodes.count(); i++)
{
QDomNode elm = nodes.at(i);
if(elm.isElement())
{
qDebug() << elm.toElement().tagName()
<< " = "<< elm.toElement().text();
}
}
return 0;
}
Других решений пока нет …