2012-03-12 4 views
4

私はこのような何かを見て.kmlファイルのファイルから座標をつかむしようとしている:QtのQXmlQueryを使用してローカルファイルに対してXPathクエリを実行するにはどうすればよいですか?

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

私はこれに類似したXPath文字列を使用して座標を取得するためにQXmlQueryを使用しようとしている:

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

私はhereをテストし、それがうまく動作することを確認しました。しかし、私はそれがQtで動作するように恐ろしい時間を過ごしました。私は多くのことを試してきました。ここには他の投稿の提案が含まれています。ここで変化を示すカップルの例があります:

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

私に私のゼロの文字列(または任意の座標かもしれ)を与える:

答えて

4

多くの実験の後、私は魔法のレシピを思いついたようです。

+1

ありがとう、それは私の多くのxpath – xkrz

関連する問題