Попытка получить строку из XML-документа с помощью QXmlQuery

Начиная с простого XML-файла:

<?xml version="1.0"?>
<playlist>
    <name>1 - first playlist</name>

    <song>Daft Punk\Discovery\Daft Punk-Discovery-01-One More Time.mp3</song>
</playlist>

Я нашел:

Я пытаюсь извлечь имя плейлиста, поэтому я попробовал:

QFile source(filePath);
source.open(QIODevice::ReadOnly | QIODevice::Text);
QXmlQuery query(QXmlQuery::XSLT20);
query.setFocus(&source);
query.setQuery("string(//name)", QUrl(filePath));

QString result = "";
query.evaluateTo(&result);

qDebug() << result;

source.close();

filePath — это QString, переданная в этот метод.

Независимо от того, что я делаю, я продолжаю получать «Ошибка синтаксического анализа: ожидается начальный тег» из загружаемого файла и безрезультатно. Когда я проверяю, что находится в файле, он выглядит правильно.


person HorusKol    schedule 18.01.2016    source источник
comment
Почему вы использовали QXmlQuery query(QXmlQuery::XSLT20); вместо простого значения по умолчанию? Я подозреваю, что, не зная API, когда вы запросите XSLT 2.0 позже, когда вы передаете выражение XPath/XQuery, процессор пытается проанализировать это выражение как документ XSLT/XML, которым он не является.   -  person Martin Honnen    schedule 18.01.2016
comment
Поскольку в документации не было конкретного примера для xpath. Это то, что я не пробовал...   -  person HorusKol    schedule 19.01.2016
comment
@MartinHonnen - хочу сделать это ответом, потому что именно это исправило - спасибо.   -  person HorusKol    schedule 19.01.2016
comment
Я поместил предложение в ответ, чтобы вы могли принять его и отметить свою проблему как решенную.   -  person Martin Honnen    schedule 20.01.2016


Ответы (1)


Используя QXmlQuery query(QXmlQuery::XSLT20);, вы запрашиваете XSLT, а не XPath или XQuery, я подозреваю, что затем вы получаете описанную ошибку, поскольку библиотека пытается проанализировать предоставленное выражение XPath или XQuery как XML-документ (поскольку XSLT — это XML, но XPath или XQuery — это не XML) . Поэтому просто используйте конструктор по умолчанию или явно установите язык как QXmlQuery::XQuery10.

person Martin Honnen    schedule 20.01.2016