使用QXmlFormatter报错FODC0002如何解决?
How to solve the error FODC0002 when using QXmlFormatter?
我正在尝试使用 QXmlQuery 从 XML 文件中获取一些元素。一切正常(我能够验证源 XML 文件等),直到我到达我尝试使用 QXmlFormatter 的部分,以便将结果写入另一个 XML 文件。当我到达这部分时,显示以下错误:tag:trolltech.com,2007:QtXmlPatterns:QIODeviceVariable:inputDocument 中的错误 FODC0002,第 1 行第 0 列:文档过早结束。
该代码基于 "Recipes" 项目,可作为 Qt 中的示例使用。这里唯一的区别是我制作了一个更简单的 "cookbook" XML 文件版本。我尝试使用 QBuffer(示例中实现的方法)而不是文件,但正如预期的那样,得到了相同的结果。
这是来源 XML,名为 temp2_xml.xml
<?xml version="1.0" encoding="UTF-8"?>
<cookbook>
<recipe>
<title>Quick and Easy Mushroom Soup</title>
<title>Cheese on Toast</title>
</recipe>
</cookbook>
这是 Xquery 文件,名为 allRecipes.xq:
(: Select all recipes. :)
declare variable $inputDocument external;
doc($inputDocument)/cookbook/recipe/<p>{string(title)}</p>
这是代码:
QFile aqr_xq("C:/test_xml/allRecipes.xq");
aqr_xq.open(QIODevice::ReadOnly);
QFile file("C:/test_xml/temp_xml.xml");
file.open(QIODevice::ReadWrite);
QFile aqr_r;
aqr_r.setFileName("C:/test_xml/temp2_xml.xml");
aqr_r.open(QIODevice::ReadOnly);
QTextStream in(&aqr_r);
QString inputDocument = in.readAll();
const QString str_query(QString::fromLatin1(aqr_xq.readAll()));
QXmlQuery query;
query.bindVariable("inputDocument",&aqr_r);
query.setQuery(str_query);
bool debug_xml = false;
debug_xml = query.isValid();
QXmlFormatter ser(query, &file);
query.evaluateTo(&ser);
关于导致问题的原因以及解决方法的任何想法?
我认为问题确实是使用文本流来使用打开的文件,如果我不使用它而只是使用代码的话
QFile aqr_xq(queryFile);
aqr_xq.open(QIODevice::ReadOnly);
QFile file(outputFile);
file.open(QIODevice::ReadWrite);
QFile aqr_r;
aqr_r.setFileName(inputFile);
aqr_r.open(QIODevice::ReadOnly);
const QString str_query(QString::fromLatin1(aqr_xq.readAll()));
QXmlQuery query;
query.bindVariable("inputDocument",&aqr_r);
query.setQuery(str_query);
bool debug_xml = false;
debug_xml = query.isValid();
QXmlFormatter ser(query, &file);
query.evaluateTo(&ser);
然后确实错误在 XQuery 中并被引发为
Error XPTY0004: Required cardinality is zero or one("?"); got cardinality one or more("+").
您没有说要创建哪个输出,但是如果您将 XQuery 更改为例如
declare variable $inputDocument external;
doc($inputDocument)/cookbook/recipe/title/<p>{string()}</p>
然后 C++ 代码运行正常。
另请注意,您可以使用
直接从文件加载 XQuery
query.setQuery(QUrl(queryFile));
我正在尝试使用 QXmlQuery 从 XML 文件中获取一些元素。一切正常(我能够验证源 XML 文件等),直到我到达我尝试使用 QXmlFormatter 的部分,以便将结果写入另一个 XML 文件。当我到达这部分时,显示以下错误:tag:trolltech.com,2007:QtXmlPatterns:QIODeviceVariable:inputDocument 中的错误 FODC0002,第 1 行第 0 列:文档过早结束。
该代码基于 "Recipes" 项目,可作为 Qt 中的示例使用。这里唯一的区别是我制作了一个更简单的 "cookbook" XML 文件版本。我尝试使用 QBuffer(示例中实现的方法)而不是文件,但正如预期的那样,得到了相同的结果。
这是来源 XML,名为 temp2_xml.xml
<?xml version="1.0" encoding="UTF-8"?>
<cookbook>
<recipe>
<title>Quick and Easy Mushroom Soup</title>
<title>Cheese on Toast</title>
</recipe>
</cookbook>
这是 Xquery 文件,名为 allRecipes.xq:
(: Select all recipes. :)
declare variable $inputDocument external;
doc($inputDocument)/cookbook/recipe/<p>{string(title)}</p>
这是代码:
QFile aqr_xq("C:/test_xml/allRecipes.xq");
aqr_xq.open(QIODevice::ReadOnly);
QFile file("C:/test_xml/temp_xml.xml");
file.open(QIODevice::ReadWrite);
QFile aqr_r;
aqr_r.setFileName("C:/test_xml/temp2_xml.xml");
aqr_r.open(QIODevice::ReadOnly);
QTextStream in(&aqr_r);
QString inputDocument = in.readAll();
const QString str_query(QString::fromLatin1(aqr_xq.readAll()));
QXmlQuery query;
query.bindVariable("inputDocument",&aqr_r);
query.setQuery(str_query);
bool debug_xml = false;
debug_xml = query.isValid();
QXmlFormatter ser(query, &file);
query.evaluateTo(&ser);
关于导致问题的原因以及解决方法的任何想法?
我认为问题确实是使用文本流来使用打开的文件,如果我不使用它而只是使用代码的话
QFile aqr_xq(queryFile);
aqr_xq.open(QIODevice::ReadOnly);
QFile file(outputFile);
file.open(QIODevice::ReadWrite);
QFile aqr_r;
aqr_r.setFileName(inputFile);
aqr_r.open(QIODevice::ReadOnly);
const QString str_query(QString::fromLatin1(aqr_xq.readAll()));
QXmlQuery query;
query.bindVariable("inputDocument",&aqr_r);
query.setQuery(str_query);
bool debug_xml = false;
debug_xml = query.isValid();
QXmlFormatter ser(query, &file);
query.evaluateTo(&ser);
然后确实错误在 XQuery 中并被引发为
Error XPTY0004: Required cardinality is zero or one("?"); got cardinality one or more("+").
您没有说要创建哪个输出,但是如果您将 XQuery 更改为例如
declare variable $inputDocument external;
doc($inputDocument)/cookbook/recipe/title/<p>{string()}</p>
然后 C++ 代码运行正常。
另请注意,您可以使用
直接从文件加载 XQueryquery.setQuery(QUrl(queryFile));