我用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"中的所有项:现在,我知道了如何创建QVector以及它们如何在内部适合元素,我只需要弄清楚如何通过推断xml文件中的信息来实现这一点。
你能帮帮我吗?
发布于 2017-11-23 17:03:35
您可以使用QXmlStreamReader遍历XML元素并找到<Column title="D">元素。一旦找到它,就可以使用结合了skipCurrentElement()的readNextStartElement()来读取它的所有子元素。
假设您在示例中显示的XML文档可以从xmlDocument对象中读取。要通过适当的错误检查从<Column title="D">元素中提取所有<item>元素,可以执行以下操作:
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")发布于 2014-02-17 21:30:34
我会用下面的方式写它:
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");
}
[..]https://stackoverflow.com/questions/21828365
复制相似问题