我想从. kml文件中提取值,以便使用R进行描述。
文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2"
xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
<open>1</open>
<visibility>1</visibility>
<name><![CDATA[2013-07-06 4:18pm]]></name>
...
<Placemark>
<name><![CDATA[2013-07-06 4:18pm (Start)]]></name>
<description><![CDATA[]]></description>
<TimeStamp><when>2013-07-06T20:18:56.000Z</when></TimeStamp>
<styleUrl>#start</styleUrl>
<Point>
<coordinates>-78.353348,45.020615,340.29998779296875</coordinates>
</Point>
</Placemark>
<Placemark id="tour">
<name><![CDATA[2013-07-06 4:18pm]]></name>
<description><![CDATA[]]></description>
...
<gx:Track>
<when>2013-07-06T20:18:56.000Z</when>
<gx:coord>-78.353348 45.020615 340.29998779296875</gx:coord>
<when>2013-07-06T20:19:12.000Z</when>
<gx:coord>-78.353315 45.020644 340.29998779296875</gx:coord>
<when>2013-07-06T22:12:23.000Z</when>
<gx:coord>-78.353108 45.020736 342.29998779296875</gx:coord>
<ExtendedData>
...
<Placemark>
<name><![CDATA[2013-07-06 4:18pm (End)]]></name>
<description><![CDATA[Created by Google My Tracks on Android.
Name: 2013-07-06 4:18pm
Activity type: cycling
Description: -
Total distance: 49.62 km (30.8 mi)
Total time: 1:53:28
Moving time: 1:50:17
Average speed: 26.24 km/h (16.3 mi/h)
Average moving speed: 27.00 km/h (16.8 mi/h)
Max speed: 61.20 km/h (38.0 mi/h)
Average pace: 2.29 min/km (3.7 min/mi)
Average moving pace: 2.22 min/km (3.6 min/mi)
Fastest pace: 0.98 min/km (1.6 min/mi)
Max elevation: 406 m (1333 ft)
Min elevation: 265 m (868 ft)
Elevation gain: 690 m (2263 ft)
Max grade: 12 %
Min grade: -11 %
Recorded: 2013-07-06 4:18pm
]]></description>
...
</Placemark>
</Document>
</kml>
这是我想提取的,包含在
<description><![CDATA[Created by Google My Tracks on Android.: ]]></description>
即。:
Name: 2013-07-06 4:18pm
Activity type: cycling
Description: -
Total distance: 49.62 km (30.8 mi)
Total time: 1:53:28
Moving time: 1:50:17
Average speed: 26.24 km/h (16.3 mi/h)
Average moving speed: 27.00 km/h (16.8 mi/h)
Max speed: 61.20 km/h (38.0 mi/h)
Average pace: 2.29 min/km (3.7 min/mi)
Average moving pace: 2.22 min/km (3.6 min/mi)
Fastest pace: 0.98 min/km (1.6 min/mi)
Max elevation: 406 m (1333 ft)
Min elevation: 265 m (868 ft)
Elevation gain: 690 m (2263 ft)
Max grade: 12 %
Min grade: -11 %
Recorded: 2013-07-06 4:18p
xmlToList给我,我认为NULL,因为CDATA标记意味着以下内容不被解析器处理:
xml <- xmlTreeParse("test1.kml", useInternalNodes=TRUE)
xmllist <- xmlToList(xml)
xmllist$Document$Placemark$description
[[1]]
NULL
我认为这就是所谓的“CDATA这个术语是用来描述XML解析器不应该解析的文本数据……解析器会忽略CDATA节中的所有内容。CDATA节以“”开头
以下内容对我也不起作用,也许是出于与CDATA相关的同样原因:
z1 <- xpathApply(xml, "//description", xmlValue)
z1
list()
有人能帮我提取文件中的文本吗?
以下是指向该文件的链接:https://docs.google.com/file/d/0B__iOdFGJbXYOHJGbWJVNW0tS3M/edit?usp=sharing
这个问题的一个整洁的解决方案是使用xml2
包读入数据。
# Instead of xmlTreeParse
read_xml("test1.kml", options = "NOCDATA")
然后,您只需使用xml\u text()
检索CDATA即可。
# Instead of xmllist$Document$Placemark$description
read_xml("test1.kml", options = "NOCDATA") %>%
xml_nodes("Placemark") %>%
xml_nodes("description") %>%
xml_text()
杰克·伯克海德在评论中回答了这个问题。他的解决方案做到了这一点。我非常感激。下面是如何从中提取文本。kml文件:
> xml1 <- xmlTreeParse("2013-07-06 4-18pm.kml", useInternalNodes=TRUE)
> root <-xmlRoot(xml1)
> names(root[["Document"]])
open visibility name author Style Style Style Style
"open" "visibility" "name" "author" "Style" "Style" "Style" "Style"
Style Schema Placemark Placemark Placemark
"Style" "Schema" "Placemark" "Placemark" "Placemark"
> # note that I want the text in the third "Placemark" which is in position [13] so:
> xmlValue(root[["Document"]][[13]][["description"]])
[1] "Created by Google My Tracks on Android.\n\nName: 2013-07-06 4:18pm\nActivity type: cycling\nDescription: -\nTotal distance: 49.62 km (30.8 mi)\nTotal time: 1:53:28\nMoving time: 1:50:17\nAverage speed: 26.24 km/h (16.3 mi/h)\nAverage moving speed: 27.00 km/h (16.8 mi/h)\nMax speed: 61.20 km/h (38.0 mi/h)\nAverage pace: 2.29 min/km (3.7 min/mi)\nAverage moving pace: 2.22 min/km (3.6 min/mi)\nFastest pace: 0.98 min/km (1.6 min/mi)\nMax elevation: 406 m (1333 ft)\nMin elevation: 265 m (868 ft)\nElevation gain: 690 m (2263 ft)\nMax grade: 12 %\nMin grade: -11 %\nRecorded: 2013-07-06 4:18pm\n"
我已经接受了这个答案,但我想我把完整的解决方案放在这里,以防它帮助别人。
非常感谢你的坚持,杰克。也感谢里卡多和阿格学习。
doc <- xmlTreeParse("test1.kml", useInternalNodes = TRUE)
root <-xmlRoot(doc)
xmlValue(root[["Document"]][["name"]])
R> xmlValue(root[["Document"]][["name"]])
[1] "2013-07-06 4:18pm"
另外,xmlToDataFrame(root)
和xmlToDataFrame(doc)
在name列中返回该值。在root或doc上使用xmlToList
会为任何CData的值返回NULL
。我正在查看名称节点,因为复制和粘贴示例不会xmlParse
。从我自己的小测试来看,这应该适用于任何CData。
问题内容: 我已将一些地址上传到BatchGeo,并下载了要从中提取坐标的结果KML文件。我设法在这里在线整理了混乱的文本文件,但是我不知道如何解析它以提取坐标。 似乎有几个适用于python的kml库,但在文档方面却没有太多(例如pyKML)。通过本教程,我已经了解了这一点,并创建了一个’lxml.etree._ElementTree’对象,但不确定其属性: 这给出了错误: 那么如何获取坐标列表
我想使用R从一个数组中读取“when”值。由Google My tracks创建的kml文件(摘录如下): 节点“when”是“与位置相对应的时间值(在gx:coord元素中指定)”。“gx:coord”是“由经度、纬度和高度三个值组成的坐标值”。(https://developers.google.com/kml/documentation/kmlreference#gxtrack) 我想要的值
我从http请求中得到了这个QString,我需要做的是只提取字符串“一致“在标签内 怎么做?
我有一个KML文件如下: 我想分别提取每个placemark的名称以及与该placemark关联的LineString标记中的所有坐标,结果如下: 我已经尝试了这里提出的所有解决方案,但没有一个适合我的数据。事实上,那里的所有解决方案都是高度通用的,并且没有提供用于检查它们的测试数据。 更新:我在下面的代码中取得了一些进展,它允许提取所有的位置标记和线性坐标(我只是忘记了该死的命名空间): 但是仍
我有这个html 并且,我试图得到每个标签的href。 例如,
我有一个带有文本元素的XML,它可以包括标记的文本,并且取决于元素属性值,我知道内容是CDATA封装的还是XHTML。 因为我不能在文本元素中拥有/创建任何子元素,所以如果我得到XHTML,我将需要封装。 这只是我需要在XSLT中转换的许多元素中的一个 一个简短的xml示例 我终于试过了,它确实达到了目的。只是html标记没有被保留。 这将产生以下结果(请注意 标记在第一个文本中消失) 我还尝试使