Wie kann ich Qts QXmlQuery verwenden, um XPath-Abfragen für eine lokale Datei auszuführen?

StackOverflow https://stackoverflow.com//questions/9675907

  •  12-12-2019
  •  | 
  •  

Frage

Ich versuche, die Koordinaten abzurufen.kml-Dateien, die ungefähr so aussehen:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
    <Document>
        <name>Name</name><Style id="roadStyle"><LineStyle><color>7fcf0064</color><width>6</width></LineStyle></Style><Snippet><![CDATA[<font size=+1><a href="http://example.com/">Printable view</a></font>]]></Snippet>
        <Placemark>
            <name>Example</name>
            <description><![CDATA[example]]></description><address>100 Example St</address><StyleMap><Pair><key>normal</key><Style><IconStyle><Icon><href>http://example.com</href></Icon><hotSpot x="0.000000" y="0.000000" xunits="fraction" yunits="fraction" /></IconStyle><ListStyle><ItemIcon><href>http://example.com</href></ItemIcon></ListStyle></Style></Pair><Pair><key>highlight</key><Style><IconStyle><scale>1.000000</scale><Icon><href>http://example.com</href></Icon><hotSpot x="0.000000" y="0.000000" xunits="fraction" yunits="fraction" /></IconStyle><ListStyle><ItemIcon><href>http://example.com</href></ItemIcon></ListStyle></Style></Pair></StyleMap><Point><coordinates>0.000000,0.000000,0</coordinates></Point><LookAt><longitude>0.000000</longitude><latitude>0.000000</latitude><range>100.000000</range><tilt>45.000000</tilt><heading>0.000000</heading></LookAt>
        </Placemark>
        <Placemark>
            <name>Route</name>
            <description><![CDATA[Example]]></description>
            <GeometryCollection>
                <LineString>
                    <coordinates>0.000000,0.000000,0.000000 0.000000,0.000000,0.000000 0.000000,0.000000,0.000000 0.000000,0.000000,0.000000 0.000000,0.000000,0.000000 0.000000,0.000000,0.000000 0.000000,0.000000,0.000000</coordinates>
                </LineString>
            </GeometryCollection>
            <styleUrl>#roadStyle</styleUrl>
        </Placemark>
    </Document>
</kml>

Ich versuche, QXmlQuery zu verwenden, um die Koordinaten mit einer ähnlichen XPath-Zeichenfolge abzurufen:

kml/Document/Placemark[last()]/GeometryCollection/LineString/coordinates

Das habe ich getestet hier und bestätigt, dass es funktioniert, so weit so gut.Aber ich hatte eine schreckliche Zeit damit, es in Qt zum Laufen zu bringen.Ich habe viele Dinge ausprobiert, einschließlich Vorschläge in anderen Beiträgen hier auf SO, ohne Glück.Hier sind ein paar Beispiele, die die Variationen zeigen:

void testQuery1(QString &filename) {
    QXmlQuery query;
    query.bindVariable("kmlFile", QVariant(filename));
    query.setQuery("declare default element namespace \"http://earth.google.com/kml/2.0\"; declare variable $kmlFile external; doc($kmlFile)//coordinates");

    QStringList results;
    query.evaluateTo(&results);

    qDebug() << results.size();
}

void testQuery2(QString &filename) {
    QFile file(filename);
    file.open(QIODevice::ReadOnly);

    QXmlQuery query;
    query.setFocus(&file);
    query.setQuery("kml/Document/Placemark[last()]/GeometryCollection/LineString/coordinates");

    QString result;
    query.evaluateTo(&result);

    qDebug() << result;
}

Ich bekomme 0 und " \n" von jedem von diesen jeweils.Wo mache ich hier einen Fehler und was muss ich tun, um das Problem zu beheben?Ich bin offen für andere Ansätze, solange sie innerhalb von Qt (ich verwende 4.7) und Standard-C ++ bleiben.

War es hilfreich?

Lösung

Nach langem Experimentieren scheine ich auf das Zauberrezept gestoßen zu sein:

void testQuery(QString &filename) {
    QFile file(filename);
    file.open(QIODevice::ReadOnly);

    QXmlQuery query;
    query.bindVariable("kmlFile", &file);
    query.setQuery("declare default element namespace \"http://earth.google.com/kml/2.0\"; declare variable $kmlFile external; doc($kmlFile)/kml/Document/Placemark[last()]/GeometryCollection/LineString/coordinates/text()");

    QString result;
    query.evaluateTo(&result);

    qDebug() << result;

    file.close();
}

Das gibt mir meine Reihe von Nullen (oder was auch immer die Koordinaten sein mögen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top