我想知道QXmlStreamReader如何适用于我正在编写的C应用程序.我想解析的
XML文件是一个大型字典,具有复杂的结构和大量的Unicode字符,所以我决定尝试一个简单的文档的小测试用例.不幸的是,我打了一堵墙.以下是xml文件示例:
<?xml version="1.0" encoding="UTF-8" ?> <persons> <person> <firstname>John</firstname> <surname>Doe</surname> <email>john.doe@example.com</email> <website>http://en.wikipedia.org/wiki/John_Doe</website> </person> <person> <firstname>Jane</firstname> <surname>Doe</surname> <email>jane.doe@example.com</email> <website>http://en.wikipedia.org/wiki/John_Doe</website> </person> <person> <firstname>Matti</firstname> <surname>Meikäläinen</surname> <email>matti.meikalainen@example.com</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.
发生了什么?这个文件不能简单,看起来和我一致.使用我的原始文件,我还得到一个空白条目的编码,条目’名称()被显示,但唉,文本()也是空的.任何建议非常感谢,个人我很胸部神秘.
解决方法
我自己回答这个问题,因为这个问题与三个问题有关,其中两个是由答复提出的.
>该文件实际上没有UTF-8编码.我将编码改为iso-8859-1,编码警告消失.
> text()函数不按预期工作.我必须使用readElementText()来读取条目的内容.
>当我尝试在不包含文本的元素上readElementText()时,如顶级< person>在我的情况下,解析器返回“预期的字符数据”错误,解析中断.我发现这个行为很奇怪(在我看来,返回一个空字符串,继续会更好),但我猜,只要规范是已知的,我可以解决它,并避免在每个条目上调用这个功能.
预期工作的相关代码部分如下所示:
while (!xml.atEnd() && !xml.hasError()) { xml.readNext(); if (xml.isStartElement()) { QString name = xml.name().toString(); if (name == "firstname" || name == "surname" || name == "email" || name == "website") { cout << "element name: '" << name << "'" << ",text: '" << xml.readElementText() << "'" << endl; } } } if (xml.hasError()) { cout << "XML error: " << xml.errorString() << endl; } else if (xml.atEnd()) { cout << "Reached end,done" << endl; }