C ++ / Qt QDomDocument перебирает все теги XML

моя проблема в том,
У меня есть большой файл в стиле 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, нахожусь ли я в нужном узле.

Но это кажется плохим способом сделать это.

2

Решение

Как прокомментировал @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;
}
2

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

Других решений пока нет …

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