Как решить ошибку FODC0002 при использовании QXmlFormatter? - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь использовать QXmlQuery для получения некоторых элементов из файла XML. Все работает нормально (я могу проверить исходный XML-файл и т. Д.), Пока не доберусь до части, в которой я пытаюсь использовать QXmlFormatter, чтобы записать результаты в другой XML-файл. Когда я добираюсь до этой части, появляется следующая ошибка: Ошибка FODC0002 в теге: trolltech.com, 2007: QtXmlPatterns: QIODeviceVariable: inputDocument, в строке 1, столбце 0: преждевременное завершение документа.

Код основан на проекте «Рецепты», доступном в качестве примера в Qt. Единственное отличие состоит в том, что я сделал более простую версию 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);

Есть идеи о том, что вызывает проблему и как ее решить?

1 Ответ

1 голос
/ 18 апреля 2019

Я думаю, что проблема действительно заключается в использовании текстового потока для использования открытого файла, если я не использую это и просто использую код

 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));
...