у меня есть этот XML
находится в C: /project/setting.xml
<?xml version='1.0'?>
<configs>
<interval>10</interval>
<size>176,144</size>
</configs>
как сделать ссылку на мой проект QT?
и как вызвать интервал и значение размера моего XML в моем файле .cpp?
благодарю вас.
Я обычно предпочитаю работать непосредственно с документом DOM непосредственно для чтения и использовать стример только для записи (QXmlStreamWriter
). С помощью QXmlStreamReader
является довольно трудоемким, поскольку, для максимальной надежности, вы должны рассмотреть все возможности для текущей позиции читателя. Если вы не возражаете против изменения метода чтения, вы можете взглянуть на этот ответ.
Qt уже предоставляет хороший учебник о том, как использовать документ DOM, но здесь у вас есть упрощенная версия для вашей текущей проблемы. Просто добавьте модуль XML в ваш проект Qt.
#include <QtXML>
bool readXML(const QString& path)
{
try {
QFile inFile(path);
if (!inFile.open(QFile::ReadOnly)) return false;
QDomDocument xml("xml");
xml.setContent(inFile.readAll());
auto configs = xml.documentElement();
if (configs.tagName() != "configs") return false;
// No error checking nor other type conversion done here
qDebug() << configs.firstChildElement("interval").firstChild().nodeValue();
qDebug() << configs.firstChildElement("size").firstChild().nodeValue();
} catch (...) {
return false;
}
return true;
}
Это не делает строгой проверки ошибок, только два из них в качестве примера. Вы всегда должны проверять, существует ли ваш текущий узел.
Важная заметка: Хитрая часть модели DOM заключается в том, что фактическое значение узла типа <interval>10</interval>
не дано
auto interval = configs.firstChildElement("interval");
qDebug() << interval.nodeValue();
но по
auto interval = configs.firstChildElement("interval");
qDebug() << interval.firstChild().nodeValue();
Текстовый узел на самом деле является первым потомком interval
узел. Имейте это в виду.
Если вы хотите перемещаться по XML, который содержит несколько элементов с одинаковым именем на одном уровне, например
<?xml version='1.0'?>
<configs>
<interval>10</interval>
<interval>100</interval>
<interval>1000</interval>
<size>176,144</size>
</configs>
Вы можете использовать nextSiblingElement
способ получить следующий элемент:
for (auto interval = configs.firstChildElement("interval");
!interval.isNull();
interval= interval.nextSiblingElement("interval")) {
// ...
}
Других решений пока нет …