c++ - 使用 QXmlStreamReader 解析 XML

标签 c++ qt qstring qvector qxmlstreamreader

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

相关文章:

c++ - 类型定义和函数指针

c++ - 带有信号和槽的 QScopedPointer

visual-studio - 如何使用 msvc2010 构建 GSL?

python - 为什么 PySide 仍然需要 QString 作为 textChanged SIGNAL?

python - 导入错误 : cannot import name 'QStringList' in PyQt5

c++ - 从大 vector 中删除第一个元素的最有效方法是什么?

c++ - 为什么当我使用的线程数比 CPU 的内核数多时,这段代码会变得更快?

c++ - 如何解析 QString 中的转义序列?

c++ - 字符数组输出不正确

c++ - 使用win32 api在qwidget中填充文本