从XML文档树中读取

时间:2014-03-19 20:54:07

标签: xml r url

我希望从具有特定纬度经度(1200行)的数据文件中获取准确的阻止FIPS ID。

Latitude    Longitude   ADT
30.0777     -92.43778   84
30.0788     -92.39427   216
30.07883    -92.39575   185
30.07952    -92.3781    88
30.08025    -92.50803   2025
30.08028    -92.36187   2715

通过拉this API,我可以像这样手动获取Block Geoid2:

<Response xmlns="http://data.fcc.gov/api" status="OK" executionTime="24">
<Block FIPS="220019612003034"/>
<County FIPS="22001" name="Acadia"/>
<State FIPS="22" code="LA" name="Louisiana"/>
</Response>

我使用每个数据点(纬度,经度)的网址创建一个新的.csv:

a <- structure(list(Latitude = c("30.0777", "30.0788", "30.07883", "30.07952", "30.08025", "30.08028"), 
Longitude = c("-92.43778", "-92.39427", "-92.39575", "-92.3781", "-92.50803", "-92.36187"), 
url= c("http://data.fcc.gov/api/block/2010/find?latitude=30.0777&longitude=-92.43778", "http://data.fcc.gov/api/block/2010/find?latitude=30.0788&longitude=-92.39427", 
"http://data.fcc.gov/api/block/2010/find?latitude=30.07883&longitude=-92.39575", "http://data.fcc.gov/api/block/2010/find?latitude=30.07952&longitude=-92.3781", 
"http://data.fcc.gov/api/block/2010/find?latitude=30.08025&longitude=-92.50803", "http://data.fcc.gov/api/block/2010/find?latitude=30.08028&longitude=-92.36187")),
.Names = c("Latitude", "Longitude", "url"), row.names = c(NA, -6L), class = "data.frame")
a
Latitude    Longitude   url
30.0777     -92.43778   http://data.fcc.gov/api/block/2010/find?latitude=30.0777&longitude=-92.43778
30.0788     -92.39427   http://data.fcc.gov/api/block/2010/find?latitude=30.0788&longitude=-92.39427
30.07883    -92.39575   http://data.fcc.gov/api/block/2010/find?latitude=30.07883&longitude=-92.39575
30.07952    -92.3781    http://data.fcc.gov/api/block/2010/find?latitude=30.07952&longitude=-92.3781
30.08025    -92.50803   http://data.fcc.gov/api/block/2010/find?latitude=30.08025&longitude=-92.50803
30.08028    -92.36187   http://data.fcc.gov/api/block/2010/find?latitude=30.08028&longitude=-92.36187

首先,我尝试获取一个特定的网址信息。但是我没有收到网址信息。

url <- "http://data.fcc.gov/api/block/2010/find?latitude=40.0&longitude=-85" 
readLines(url)
[1] "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Response xmlns=\"http://data.fcc.gov/api\" status=\"OK\" executionTime=\"10\"><Block FIPS=\"181770103002004\"/><County FIPS=\"18177\" name=\"Wayne\"/><State FIPS=\"18\" code=\"IN\" name=\"Indiana\"/></Response>"
Warning message:
In readLines(url) :
  incomplete final line found on 'http://data.fcc.gov/api/block/2010/find?latitude=40.0&longitude=-85'

最后我想要这样的最后一张桌子。

Latitude    Longitude   ADT      Block_FIPS
30.0777     -92.43778   84       220019603002020
30.0788     -92.39427   216      220019604002099
30.07883    -92.39575   185      220019603003019
30.07952    -92.3781    88       220019602002049
30.08025    -92.50803   2025     220019602003017
30.08028    -92.36187   2715     220019602003062

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您是否已尝试使用XML包?

以下是使用此套件提取您感兴趣的数量的方法:

library(XML)
url <- "http://data.fcc.gov/api/block/2010/find?latitude=40.0&longitude=-85" 
api.call <- xmlInternalTreeParse(url)

xmlAttrs(xmlRoot(api.call)[[1]])

根据您拥有的数据量,您可以循环遍历所有URL并将提取的数据附加到数据集中,也可以编写一个小函数来避免R在循环方面的缓慢。

<强>更新

以下是一个快速示例,说明如何在循环中包含上面的代码,以便为数据集中的所有行提取FIPS代码。

a$FIPS <- NA
for (i in 1:nrow(a)) {
    api.call <- xmlInternalTreeParse(a$url[i])
    a$FIPS[i] <- return(xmlAttrs(xmlRoot(api.call)[[1]]))
}

这与函数完全相同(将一个URL值作为输入):

get.fips <- function(url) {
api.call <- xmlInternalTreeParse(url)
return(xmlAttrs(xmlRoot(api.call)[[1]]))
}
# example: get.fips(a$url[1])