我想弄清楚QXmlStreamReader如何为我写的C++应用程序工作。我想解析的XML文件是一个庞大的词典,它具有复杂的结构和大量的Unicode字符,所以我决定用一个更简单的文档来尝试一个小的测试用例。不幸的是,我撞墙了。下面是示例XML文件:为什么我无法使用Qt中的QXmlStreamReader解析XML文件?
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<firstname>John</firstname>
<surname>Doe</surname>
<email>[email protected]</email>
<website>http://en.wikipedia.org/wiki/John_Doe</website>
</person>
<person>
<firstname>Jane</firstname>
<surname>Doe</surname>
<email>[email protected]</email>
<website>http://en.wikipedia.org/wiki/John_Doe</website>
</person>
<person>
<firstname>Matti</firstname>
<surname>Meikäläinen</surname>
<email>[email protected]</email>
<website>http://fi.wikipedia.org/wiki/Matti_Meikäläinen</website>
</person>
</persons>
...我试图用这个代码解析它:
int main(int argc, char *argv[])
{
if (argc != 2) return 1;
QString filename(argv[1]);
QTextStream cout(stdout);
cout << "Starting... filename: " << filename << endl;
QFile file(filename);
bool open = file.open(QIODevice::ReadOnly | QIODevice::Text);
if (!open)
{
cout << "Couldn't open file" << endl;
return 1;
}
else
{
cout << "File opened OK" << endl;
}
QXmlStreamReader xml(&file);
cout << "Encoding: " << xml.documentEncoding().toString() << endl;
while (!xml.atEnd() && !xml.hasError())
{
xml.readNext();
if (xml.isStartElement())
{
cout << "element name: '" << xml.name().toString() << "'"
<< ", text: '" << xml.text().toString() << "'" << endl;
}
else if (xml.hasError())
{
cout << "XML error: " << xml.errorString() << endl;
}
else if (xml.atEnd())
{
cout << "Reached end, done" << endl;
}
}
return 0;
}
...然后我得到这样的输出:
C:\xmltest\Debug>xmltest.exe example.xml
Starting... filename: example.xml
File opened OK
Encoding:
XML error: Encountered incorrectly encoded content.
发生了什么事?这个文件不能简单一些,它看起来与我一致。用我的原始文件,我也得到一个空白条目的编码,条目的名称()显示,但唉,文本()也是空的。任何建议非常感谢,我个人觉得神秘莫测。
有趣的是,readElementText()总体上有点bug,在增量读取数据时也不起作用从数据可能不完整的流(例如套接字),请参阅http://bugreports.qt.nokia.com/browse/QTBUG-14661 – 2010-11-17 17:55:36
我应该将此报告为错误吗?我不确定它是否可以是,还是如果它应该这样工作。 – neuviemeporte 2010-11-17 22:06:12
@FrankOsterfeld在'readElementText()'上有什么新东西?是否有任何功能来检查它是否会工作? – Niklas 2014-07-08 23:48:21