neu*_*rte 10 c++ xml qt qt4 xml-parsing
我正在试图弄清楚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>
Run Code Online (Sandbox Code Playgroud)
...而我正在尝试使用以下代码解析它:
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;
}
Run Code Online (Sandbox Code Playgroud)
...然后我得到这个输出:
C:\ xmltest\Debug> xmltest.exe example.xml
开始... filename:example.xml
文件已打开OK
编码:
XML错误:遇到编码错误的内容.
发生了什么?这个文件不能简单,看起来和我一致.使用我的原始文件,我也得到一个空白的编码条目,显示条目的名称(),但是,唉,text()也是空的.任何建议都非常感激,个人而言我是彻底的神秘.
neu*_*rte 11
我自己也在回答这个问题,因为这个问题与三个问题有关,其中两个问题是由答复提出来的.
现在按预期工作的相关代码部分如下所示:
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21063 次 |
| 最近记录: |