我使用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>
我想创建一个包含标签Column title="D"
内所有项目的String Vector:现在,我知道如何创建一个QVector
以及它们如何适应内部的元素,我只是通过从xml文件中推断信息来弄清楚我如何做到这一点。
你能帮助我吗?
答案 0 :(得分:0)
您可以使用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")
答案 1 :(得分:-1)
我会用以下方式写它:
QVector<QString> store;
[..]
if (reader.readNextStartElement() && reader.name() == "Draw") {
while (reader.readNextStartElement() && reader.name() == "Input") {
while (reader.readNextStartElement()) {
QXmlStreamAttributes attr = reader.attributes();
if (reader.name() == "Column" && attr.value("title").toString() == "D") {
while(!(reader.isEndElement() && reader.name() == "Column")) {
if (reader.isStartElement() && reader.name() == "item") {
QString text = reader.readElementText();
store.append(text);
}
reader.readNext();
if (reader.hasError()) {
// Handle error.
QString msg = reader.errorString();
break;
}
}
} else {
reader.readNext();
}
}
}
} else {
reader.raiseError("Expected <Draw> element");
}
[..]