如何使用 Qt 的 QXmlQuery 在本地文件上运行 XPath 查询?
题
我试图从 .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
我已经测试过了 这里 并确认它有效,到目前为止一切顺利。但我在让它在 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();
}
这给了我一串零(或者任何坐标)。
不隶属于 StackOverflow