我试图弄清楚 QXmlStreamReader 如何适用于我正在编写的 C++ 应用程序。我想要解析的 XML 文件是一个大字典,具有复杂的结构和大量的 Unicode 字符,因此我决定使用更简单的文档尝试一个小型测试用例。不幸的是,我碰壁了。下面是 xml 文件示例:
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<firstname>John</firstname>
<surname>Doe</surname>
<email>[email protected] /cdn-cgi/l/email-protection</email>
<website>http://en.wikipedia.org/wiki/John_Doe</website>
</person>
<person>
<firstname>Jane</firstname>
<surname>Doe</surname>
<email>[email protected] /cdn-cgi/l/email-protection</email>
<website>http://en.wikipedia.org/wiki/John_Doe</website>
</person>
<person>
<firstname>Matti</firstname>
<surname>Meikäläinen</surname>
<email>[email protected] /cdn-cgi/l/email-protection</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
正在开始... 文件名:example.xml
文件打开正常
编码:
XML 错误:遇到编码不正确的内容。
发生了什么?这个文件再简单不过了,而且对我来说看起来是一致的。在我的原始文件中,我还得到了一个空白的编码条目,显示了条目的名称(),但可惜的是,文本()也是空的。非常感谢任何建议,我个人非常困惑。
我自己回答这个问题,因为这个问题与三个问题有关,其中两个是由回复提出的。
- 该文件实际上不是 UTF-8 编码的。我将编码更改为 iso-8859-1,编码警告消失了。
- text() 函数没有按我的预期工作。我必须使用 readElementText() 来读取条目的内容。
- 当我尝试对不包含文本的元素(例如我的情况下的顶级 )读取ElementText()时,解析器返回一个“预期的字符数据”错误并且解析被中断。我发现这种行为很奇怪(在我看来返回一个空字符串并继续会更好),但我想只要规范已知,我就可以解决它并避免在每个条目上调用此函数。
按预期工作的相关代码部分现在如下所示:
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)