所以我知道这个主题已经在这里进行了广泛的讨论。我在同一件事上发现了很多问题,但仍然无法弄清楚如何解析这个XML文件。我正在使用 R ,我想从文件中提取经度和纬度。
I'm using this data和this guide但似乎无法使其发挥作用。
以下是我的工作:
require(XML)
data <- xmlParse("http://www.donatingplasma.org/index.php?option=com_storelocator&format=feed&searchall=1&Itemid=166&catid=-1&tagid=-1&featstate=0")
xml_data <- xmlToList(data)
一切正常。 XML文件现在是一个“大型列表”。当我试图提取纬度和经度时,我迷失了。我试过了:
location <- as.list(xml_data[["marker"]][["lat"]])
获得了一行的列表。
我如何从这个XML数据中提取纬度和经度?
数据结构示例:
<markers>
<limited>0</limited>
<marker>
<name>ADMA BioCenters</name>
<category>IQPP Certified</category>
<markertype>
/media/com_storelocator/markers/100713214004000000jl_marker2.png
</markertype>
<featured>false</featured>
<address>
6290 Jimmy Carter Boulevard, Suite 208, Norcross, Georgia 30071
</address>
<lat>33.9290629</lat>
<lng>-84.2204952</lng>
<distance>0</distance>
<fulladdress>
<![CDATA[
<p><img style="margin-left: auto; margin-right: auto;" src="images/jl_marker2.png" alt="jl marker2" width="22" height="22" />IQPP Certified</p>
]]>
</fulladdress>
<phone>678-495-5800</phone>
<url>http://www.atlantaplasma.com</url>
<email/>
<facebook/>
<twitter/>
<tags>
<![CDATA[ ]]>
</tags>
<custom1 name="Custom Field 1">
<![CDATA[ ]]>
</custom1>
<custom2 name="Custom Field 2">
<![CDATA[ ]]>
</custom2>
<custom3 name="Custom Field 3">
<![CDATA[ ]]>
</custom3>
<custom4 name="Custom Field 4">
<![CDATA[ ]]>
</custom4>
<custom5 name="Custom Field 5">
<![CDATA[ ]]>
</custom5>
答案 0 :(得分:2)
在原始XML上使用xpathSapply
,而不是通过列表。
lat <- xpathSApply(data, '//marker/lat', xmlValue)
long <- xpathSApply(data, '//marker/lng', xmlValue)
结果:
> head(cbind(lat, long))
lat long
[1,] "33.9290629" "-84.2204952"
[2,] "48.3097292" "14.299297"
[3,] "41.6134569" "-87.514584"
[4,] "41.5878273" "-87.3369907"
[5,] "39.98504" "-83.004705"
[6,] "43.2056277" "-86.2708023"
根据@Martin Morgan的评论,我认为在这里对不同的策略进行基准测试会很好:
> microbenchmark(xpathSApply(data, '//marker/lat', xmlValue),
sapply(data["//marker/lat"], xmlValue),
sapply(data["//marker/lat"], as, "numeric"))
Unit: milliseconds
expr min lq median uq max neval
xpathSApply(data, "//marker/lat", xmlValue) 67.03714 97.57796 100.1633 102.1815 213.3031 100
sapply(data["//marker/lat"], xmlValue) 72.73847 103.63095 106.1037 108.2251 132.6314 100
sapply(data["//marker/lat"], as, "numeric") 257.16364 346.13708 389.3025 394.3669 598.3736 100
似乎
显然,最后一个策略效率最低(这是有道理的,因为它在每个节点上调用类型转换。但这使得它不是一个完全公平的测试,因为最后一个表达式产生数字输出而前两个产生字符输出。第二次测试:
> microbenchmark(as.numeric(xpathSApply(data, '//marker/lat', xmlValue)),
as.numeric(sapply(data["//marker/lat"], xmlValue)),
sapply(data["//marker/lat"], as, "numeric"))
Unit: milliseconds
expr min lq median uq max neval
as.numeric(xpathSApply(data, "//marker/lat", xmlValue)) 60.29744 80.08186 97.94924 100.9548 189.0797 100
as.numeric(sapply(data["//marker/lat"], xmlValue)) 59.45891 85.47169 103.68015 106.5882 124.5708 100
sapply(data["//marker/lat"], as, "numeric") 210.92816 339.54831 384.28481 392.0001 481.4498 100
同样,使用xpathSApply
或sapply
(使用xpath提取)会产生非常相似的结果。所以马丁的第一个解决方案的修改版本:
lat <- as.numeric(sapply(data["//marker/lat"], xmlValue))
可能是这里最好的策略。