我想弄清楚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