Атрибут подзапроса Qt XmlQuery

Я пытаюсь проанализировать файл gpx, используя QXmlQuery (Qt 5.0).

Идея состоит в том, чтобы собрать все элементы trkpt, а затем выполнить подзапрос каждого элемента, чтобы извлечь широту, долготу, высоту …

Проблема в том, что он, кажется, не распознает имя атрибута, потому что этот код работает:

query.setQuery
(
"declare default element namespace \"http://www.topografix.com/GPX/1/1\";""declare variable $gpxFile external;""doc($gpxFile)//trkpt");

if(query.isValid())
{
QXmlResultItems trkpts;
query.evaluateTo(&trkpts);
for(QXmlItem trkpt = trkpts.next(); !trkpt.isNull(); trkpt = trkpts.next())
{
QXmlQuery childQuery;
QStringList res;

childQuery.setFocus(trkpt);
childQuery.setQuery
(
"@*/string()"); // <------------------------- this prints out all the attributes

childQuery.evaluateTo(&res);
qDebug() << res << "\n";
}
}

в то время как этот не делает:

        // ... same code as above
childQuery.setQuery
(
"@lat/string()"); // <------------------------- this prints out only a \n
// ... same code as above

есть идеи о том, что не так?

Обратите внимание, что если я попытаюсь собрать все атрибуты @lat с помощью «внешнего» запроса, он будет работать как положено:

query.setQuery
(
"declare default element namespace \"http://www.topografix.com/GPX/1/1\";""declare variable $gpxFile external;""doc($gpxFile)//trkpt/@lat/string()");

РЕДАКТИРОВАТЬ

Это пример файла gpx:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<gpx
version="1.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.topografix.com/GPX/1/0"xmlns:topografix="http://www.topografix.com/GPX/Private/TopoGrafix/0/2"xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.topografix.com/GPX/Private/TopoGrafix/0/2 http://www.topografix.com/GPX/Private/TopoGrafix/0/2/topografix.xsd">
<trk>
<name>My track</name>
<desc>My track description</desc>
<trkseg>
<trkpt lat="38.919839863" lon="-121.020112049">
<ele>265.447754</ele>
<time>2003-02-05T18:19:20Z</time>
</trkpt>
<trkpt lat="38.919796947" lon="-121.020240795">
<ele>264.967041</ele>
<time>2003-02-05T18:19:20Z</time>
</trkpt>
<trkpt lat="38.919861320" lon="-121.020498287">
<ele>263.044434</ele>
<time>2003-02-05T18:19:20Z</time>
</trkpt>
<trkpt lat="38.919990066" lon="-121.020798694">
<ele>263.525146</ele>
<time>2003-02-05T18:19:20Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>

РЕДАКТИРОВАТЬ

Я нашел способ решения этой проблемы, используя QDomDocument вместо QXmlQuery.
Результат выглядит как код ниже (все проверки ошибок удалены для краткости):

QFile file = ("mytrack.gpx");
file.open(QIODevice::ReadOnly);

QDomDocument doc("mydoc");
doc.setContent(&file);

QDomElement root = doc.documentElement();
QDomNodeList trkpts = root.elementsByTagName("trkpt");

for(int i = 0; i < trkpts.length(); i++)
{
QDomElement e = trkpts.at(i).toElement();

QString latitude = e.attribute("lat");
QString longitude = e.attribute("lon");

QDomNodeList elevation_list = e.elementsByTagName("ele");
QString elevation = elevation_list.at(0).toElement().text();

// ... and so on
}

Я хотел бы найти решение этой проблемы с помощью QXmlQuery, но пока что это просто работает.

1

Решение

Я не уверен, потому что я не знаю QXmlQuery и как он обрабатывает запросы и их выполнение. Но я думаю, это может быть проблема с пространством имен. В первом запросе вы определяете пространство имен по умолчанию, а во втором — нет. Возможно, это пространство имен по умолчанию не используется во втором запросе (childQuery). По крайней мере, это будет соответствовать @*/String() печатать что-то. Может быть, вы могли бы попробовать, если @*:lat/string работает как положено.

В противном случае, некоторые примеры данных были бы очень ценными.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]