我用 QXmlStreamWriter
创建了这个 xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<Draw>
<Input>
<Column title="A"/>
<Column title="B"/>
<Column title="C"/>
<Column title="D">
<item id="0">Bayer Leverkusen</item>
<item id="1">Benfica</item>
<item id="2">Villareal</item>
<item id="3">Montpellier</item>
</Column>
</Input>
</Draw>
我想创建一个 Vector of String,其中包含标签 Column title="D"
中的所有项目:现在,我知道如何创建一个 QVector
和它们如何适合内部元素,我只需要弄清楚如何通过从 xml 文件中推断信息来做到这一点。
你能帮帮我吗?
最佳答案
您可以使用 QXmlStreamReader
遍历 XML 元素并找到 <Column title="D">
元素。一旦找到它, readNextStartElement()
结合 skipCurrentElement()
可用于读取其所有子元素。
假设可以从 xmlDocument
中读取您在示例中显示的 XML 文档目的。提取所有 <item>
来自 <Column title="D">
的元素元素进行适当的错误检查,您可以执行以下操作:
QXmlStreamReader xmlIterator(xmlDocument);
QVector<QString> output;
for(; !xmlIterator.atEnd(); xmlIterator.readNext()) {
if(isStartElementOfColumnD(xmlIterator)) {
while(xmlIterator.readNextStartElement()) {
if(isItemElement(xmlIterator))
output.append(xmlIterator.readElementText());
else
xmlIterator.skipCurrentElement();
}
}
}
if(xmlIterator.hasError())
qCritical() << "Error has occurred:" << xmlIterator.errorString();
else
qDebug() << output;
在上面的示例中,我使用了两个谓词来隐藏 xmlIterator
的冗长且难以阅读的验证。 .这些是:
inline bool isStartElementOfColumnD(const QXmlStreamReader& xmlIterator) {
return xmlIterator.isStartElement() && xmlIterator.name() == "Column" &&
xmlIterator.attributes().value("title") == "D";
}
inline bool isItemElement(const QXmlStreamReader& xmlIterator) {
return xmlIterator.name() == "item" &&
xmlIterator.attributes().hasAttribute("id");
}
示例结果:
QVector("Bayer Leverkusen", "Benfica", "Villareal", "Montpellier")
关于c++ - 使用 QXmlStreamReader 解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21828365/