无法使用R从XML中提取数据

时间:2014-02-19 20:36:42

标签: xml r parsing data-structures

所以我知道这个主题已经在这里进行了广泛的讨论。我在同一件事上发现了很多问题,但仍然无法弄清楚如何解析这个XML文件。我正在使用 R ,我想从文件中提取经度和纬度。

I'm using this datathis 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>

1 个答案:

答案 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

同样,使用xpathSApplysapply(使用xpath提取)会产生非常相似的结果。所以马丁的第一个解决方案的修改版本:

lat <- as.numeric(sapply(data["//marker/lat"], xmlValue))

可能是这里最好的策略。