使用QDomDocument时报告详细的XML错误

时间:2016-04-12 14:43:40

标签: c++ xml qt qt4

我目前正在修改一些使用QDomDocument解析XML文件内容的旧代码。示例代码如下:

 $scope.$on('data_shared',function(event, data) {
    $scope.gridApi.selection.selectRow( $scope.gridOptions.data[0] ); 
   });

不幸的是,错误报告非常有限。删除文件中间一半的结束标记只会报告以下错误:

文件config.xml中的XML无效。错误=意外的文件结束,Line = 1,Column = 1

这是相当无用的。

有关如何从Qt的XML解析器中获取更多描述性错误的任何建议?准确的行号将是一个良好的开端。

P.S。我正在使用Qt版本4.7.4。

2 个答案:

答案 0 :(得分:1)

QDomDocument::setContent应该为您提供正确的信息,以了解问题所在。

例如,使用以下代码片段:

#include <QtXml>
#include <QtCore>

int main()
{
    QFile file(":/myxml_error.xml");

    qDebug() << "File path:" << QFileInfo(file).absoluteFilePath();
    qDebug() << "File exists:" << file.exists();

    file.open(QFile::ReadOnly|QFile::Text);

    qDebug() << "File open:" << file.isOpen();

    QDomDocument dom;
    QString error;

    int line, column;

    if(dom.setContent(&file, &error, &line, &column)){
        qDebug() << dom.toString(4);
    } else {
        qDebug() << "Error:" << error << "in line " << line << "column" << column;
    }
    return 0;
}

这个xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<note>
    <to>Tove</to>
    <from>Jani</Ffrom>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

我们看到以下错误:

Error: "tag mismatch" in line 4 column 19

我在阅读了@ kh25的一些评论后更新了这个答案。

  • 问题可能是文件编码造成的。在这种情况下,我们可以尝试删除回车和新行。如果我们在Linux上工作,dos2unix可以提供帮助。
  • 另一种选择是使用online tool来检查XML。

但在这种特殊情况下,问题似乎与关闭文件 - file.close() - 在调用in.readAll()之前有关。在这种情况下,QDomDocument::setContent正在读取空字符串,我们会看到错误unexpected end of file

另一种获取错误的方法是在文件到达流的末尾时调用QDomDocument::setContent

因此,如果我们两次调用示例QTextStream::readAll(),我们会得到相同的错误。即:

QTextStream in(&file);
in.readAll();

if(dom.setContent(in.readAll(), &error, &line, &column)) {
    qDebug() << "Content: " << dom.toString(4);
} else {        
    qDebug() << "Error:" << error << "in line " << line << "column" << column;
}

@MrEricSir评论了使用QXMLStreamReader。如果您需要一个示例,我在GitHub中有一个小项目,我在那里使用该类。

答案 1 :(得分:1)

在文件中报告准确的XML错误的正确代码如下:

QFile file(file_.filePath());

if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
    QString errorMsg;
    int errorLine;
    int errorColumn;

    if (!doc.setContent(in.readAll(), &errorMsg, &errorLine, &errorColumn)) {
        QString line;
        file.seek(0);

        for (int i = 0; i < errorLine; ++i) {
            line = file.readLine();
        }

        qFatal("Invalid XML encountered.\nFile %s.\nError = %s\nLine= %d\n%s", qPrintable(file_.absoluteFilePath()), qPrintable(errorMsg), errorLine, qPrintable(line.insert(errorColumn -1, "^").trimmed()));
    }
}