使用 QDomDocument 时报告详细的 XML 错误
Reporting detailed XML errors when using QDomDocument
我目前正在修改一些使用 QDomDocument 来解析 XML 文件内容的旧代码。示例代码如下:
QFile file(file_.filePath());
if (file.open(QIODevice::ReadOnly))
{
QTextStream in(&file);
file.close();
QString errorMsg;
int errorLine;
int errorColumn;
if (!doc.setContent(in.readAll(), &errorMsg, &errorLine, &errorColumn))
{
qWarning("Invalid XML in file %s. Error = %s, Line = %d, Column = %d", qPrintable(file_name), qPrintable(errorMsg), errorLine, errorColumn);
}
}
不幸的是,错误报告非常有限。删除文件中途的结束标记只会报告以下错误:
文件 config.xml 中的 XML 无效。错误 = 文件意外结束,行 = 1,列 = 1
这没什么用。
关于如何从 Qt 的 XML 解析器中获取更多描述性错误的任何建议?准确的行号将是一个好的开始。
P.S。我正在使用 Qt 版本 4.7.4.
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 的一些评论后更新了这个答案。
- 问题可能是文件编码问题。在这种情况下,我们可以尝试删除回车 returns 和新行。如果我们正在处理 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 中有一个小项目,我在其中使用 class.
报告准确 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()));
}
}
我目前正在修改一些使用 QDomDocument 来解析 XML 文件内容的旧代码。示例代码如下:
QFile file(file_.filePath());
if (file.open(QIODevice::ReadOnly))
{
QTextStream in(&file);
file.close();
QString errorMsg;
int errorLine;
int errorColumn;
if (!doc.setContent(in.readAll(), &errorMsg, &errorLine, &errorColumn))
{
qWarning("Invalid XML in file %s. Error = %s, Line = %d, Column = %d", qPrintable(file_name), qPrintable(errorMsg), errorLine, errorColumn);
}
}
不幸的是,错误报告非常有限。删除文件中途的结束标记只会报告以下错误:
文件 config.xml 中的 XML 无效。错误 = 文件意外结束,行 = 1,列 = 1
这没什么用。
关于如何从 Qt 的 XML 解析器中获取更多描述性错误的任何建议?准确的行号将是一个好的开始。
P.S。我正在使用 Qt 版本 4.7.4.
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 的一些评论后更新了这个答案。
- 问题可能是文件编码问题。在这种情况下,我们可以尝试删除回车 returns 和新行。如果我们正在处理 Linux。 ,
- 另一种选择是使用 online tool 检查 XML。
dos2unix
可以提供帮助
但在这种特殊情况下,问题似乎与关闭文件有关 -- 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 中有一个小项目,我在其中使用 class.
报告准确 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()));
}
}