gpt4 book ai didi

c++ - 使用 QXmlStreamReader 解析 XML

转载 作者:太空宇宙 更新时间:2023-11-04 14:32:06 36 4
gpt4 key购买 nike

我用 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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com