كيف يمكنني استخدام QXmlQuery الخاص بـ Qt لتشغيل استعلامات XPath على ملف محلي؟

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

  •  12-12-2019
  •  | 
  •  

سؤال

أحاول الحصول على الإحداثيات من ملفات .kml التي تبدو كما يلي:

<?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>

أحاول استخدام QXmlQuery لاسترداد الإحداثيات باستخدام سلسلة XPath مشابهة لما يلي:

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

لقد اختبرت ذلك هنا وأكد أنه يعمل، حتى الآن جيد جدًا.لكني واجهت وقتًا عصيبًا في جعله يعمل في كيو تي.لقد جربت الكثير من الأشياء، بما في ذلك الاقتراحات الموجودة في منشورات أخرى هنا على SO، ولكن دون جدوى.فيما يلي بعض الأمثلة التي توضح الاختلافات:

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;
}

انا حصلت 0 و " \n" من كل منهما على التوالي.أين أخطأت هنا وما الذي يجب علي فعله لإصلاحه؟أنا منفتح على الأساليب الأخرى طالما أنها تظل ضمن Qt (أنا أستخدم 4.7) ومعيار C++.

هل كانت مفيدة؟

المحلول

وبعد الكثير من التجارب، يبدو أنني توصلت إلى الوصفة السحرية:

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();
}

وهذا يعطيني سلسلة من الأصفار (أو أيًا كانت الإحداثيات).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top