Tôi đang cố gắng tìm hiểu cách QXmlStreamReader hoạt động cho ứng dụng C++ mà tôi đang viết. Tệp XML mà tôi muốn phân tích là một từ điển lớn với cấu trúc phức tạp và nhiều ký tự Unicode nên tôi đã quyết định thử một trường hợp thử nghiệm nhỏ với một tài liệu đơn giản hơn. Thật không may, tôi đã đâm vào tường. Dưới đây là những ví dụ tập tin xml:Tại sao tôi không thể phân tích cú pháp tệp XML bằng QXmlStreamReader từ Qt?
<?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>
... và tôi đang cố gắng để phân tích nó sử dụng mã này:
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;
}
... sau đó tôi nhận được kết quả này:
C:\xmltest\Debug>xmltest.exe example.xml
Starting... filename: example.xml
File opened OK
Encoding:
XML error: Encountered incorrectly encoded content.
Điều gì đã xảy ra? Tệp này không thể đơn giản hơn và có vẻ phù hợp với tôi. Với tệp gốc của tôi, tôi cũng nhận được một mục nhập trống cho mã hóa, tên của các mục() được hiển thị, nhưng than ôi, văn bản() cũng trống. Bất kỳ đề xuất đánh giá rất nhiều, cá nhân tôi là Thorougly mystified.
Thú vị Có, readElementText() có lỗi một chút nói chung cũng không hoạt động đúng khi đọc dữ liệu từng bước từ luồng nơi dữ liệu có thể không đầy đủ (ví dụ: ổ cắm), hãy xem http://bugreports.qt.nokia.com/browse/QTBUG-14661 –
Tôi có nên báo cáo lỗi này là lỗi không? đó là, hoặc nếu nó phải làm việc theo cách đó. – neuviemeporte
@ FrankOsterfeld có gì mới trên 'readElementText()' không? Có chức năng nào để kiểm tra xem nó có hoạt động hay không? – Niklas