- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 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>
编辑
我通过使用 QDomDocument 而不是 QXmlQuery 找到了解决此问题的方法。结果类似于下面的代码(为简洁起见删除了所有错误检查):
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 找到这个问题的解决方案,但与此同时,这很管用。
最佳答案
我不确定,因为我不知道 QXmlQuery 以及它如何处理查询解析和执行。但我想这可能是一个命名空间问题。在第一个查询中,您定义了一个默认 namespace ,而在第二个查询中,您没有。也许这个默认命名空间没有在第二个查询(childQuery)中使用。至少它适合 @*/String()
打印一些东西。也许您可以尝试 @*:lat/string
是否按预期工作。
否则,一些示例数据将非常有值(value)。
关于c++ - Qt XmlQuery 子查询属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14427052/
甲骨文版本 11.2 下面是我在 XMLType 列上运行的 XMLQuery 的缩减版本。当我运行查询时,它只是解析并重新创建存储的 XML,tsxm 命名空间( 不等于默认命名空间 )被更改。这个
如何在 postgres 中使用 xmlquery? 例如:这是在 SQL Server Xml 查询中 SELECT MyXmlField.query('data(/root/product[@id
我正在尝试使用 QXmlQuery (Qt 5.0) 解析 gpx 文件。 想法是收集所有的 trkpt 元素,然后子查询每个元素以提取纬度、经度、高度... 问题是它似乎无法识别属性名称,因为这段代
甲骨文 11.2 下面是我在 XMLType 列上运行的 XMLQuery 的简化版本。当我运行查询时,它只是解析并重新创建存储的 XML,不需要的 default 和 tsip 命名空间被插入到父元
我有一个包含 xmltype 列和其他非 xmltype 列的表 (Oracle 11.2.0.2)。我想根据一些非 xmltype 列的值加上 xmltype 列的内容进行选择。 我已经尝试在我的选
我正在使用 XMLQuery() 在我的表中执行一些 XQuery,这些表由带有 XML 文档(Oracle 的 XMLTYPE)的记录组成。 Oracle 查询如下所示: SELECT XMLQue
我们使用 MSBuild 运行一个项目,其中包括通过社区任务包中的 XMLQuery 任务从 XML 文件中读取一些值。它在 MSBuild 3.5 下运行良好,但在 4.0 下运行时失败,并显示以下
我是一名优秀的程序员,十分优秀!