1

QXmlQuery (Qt 5.0) を使用して gpx ファイルを解析しようとしています。

アイデアは、すべての 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>

編集

QXmlQuery の代わりに QDomDocument を使用することで、この問題の回避策を見つけました。結果は次のコードのようになります (簡潔にするためにすべてのエラー チェックを削除しています)。

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 を使用してこの問題の解決策を見つけたいのですが、当面はこれでうまくいきます。

4

1 に答える 1

0

QXmlQuery と、QXmlQuery がクエリの解析と実行をどのように処理するかを知らないため、よくわかりません。しかし、名前空間の問題である可能性があると思います。最初のクエリではデフォルトの名前空間を定義しますが、2 番目のクエリでは定義しません。このデフォルトの名前空間は、2 番目のクエリ (childQuery) で使用されていない可能性があります。少なくとも@*/String()何かを印刷するのには適しています。期待どおりに動作するかどうかを試すことができます@*:lat/string

それ以外の場合、いくつかのサンプル データは非常に価値があります。

于 2013-01-20T20:12:18.340 に答える