例如
<name>Niddrie</name>
<latitude>-37.737332</latitude>
<longtitude>144.892342</longtitude>
我该怎么做?我已经尝试过这些:
library(XML)
library(methods)
library(xml2)
#https://stackoverflow.com/questions/17198658/how-to-parse-xml-to-r-data-frame
data <- xmlParse("http://contact.woolworths.com.au/storelocator/service/proximity/supermarkets/latitude/-37.7510/longitude/144.8981/range/50/max/200.xml")
xml_data <- xmlToList(data)
location <- as.list(xml_data[["storeList"]][["storeRank"]][["storeDetail"]][["Name"]])
#https://www.datacamp.com/community/tutorials/r-data-import-tutorial#xml - not working
xmlfile <- xmlTreeParse("http://contact.woolworths.com.au/storelocator/service/proximity/supermarkets/latitude/-37.7510/longitude/144.8981/range/50/max/200.xml")
class(xmlfile)
topxml <- xmlRoot(xmlfile)
topxml <- xmlSApply(topxml,
function(x) xmlSApply(x, xmlValue))
xml_df <- data.frame(t(topxml),
row.names=NULL)
对于这两者,都没有错误,但是没有我想要的名称。与坐标相同。
答案 0 :(得分:1)
看起来XML只能来自API。它确实有一个名称空间,所以很可能是造成您问题的原因。我们将其删除。
library(xml2)
xml_ns_strip(
doc <- read_xml("http://contact.woolworths.com.au/storelocator/service/proximity/supermarkets/latitude/-37.7510/longitude/144.8981/range/50/max/200.xml")
) -> doc
data.frame(
name = xml_text(xml_find_all(doc, ".//storeDetail/name")),
lng = xml_double(xml_find_all(doc, ".//storeDetail/longtitude")),
lat = xml_double(xml_find_all(doc, ".//storeDetail/latitude")),
stringsAsFactors = FALSE
) -> stores
str(stores)
## 'data.frame': 188 obs. of 3 variables:
## $ name: chr "Niddrie" "Highpoint West" "Moonee Ponds" "East Keilor" ...
## $ lng : num 145 145 145 145 145 ...
## $ lat : num -37.7 -37.8 -37.8 -37.7 -37.7 ...
对于仍在使用XML
的用户:
library(XML)
doc <- xmlParse("http://contact.woolworths.com.au/storelocator/service/proximity/supermarkets/latitude/-37.7510/longitude/144.8981/range/50/max/200.xml")
def <- c(d = getDefaultNamespace(doc)[[1]]$uri)
data.frame(
name = xpathSApply(doc, "//d:storeDetail/d:name", xmlValue, namespaces = def),
lng = as.numeric(xpathSApply(doc, "//d:storeDetail/d:longtitude", xmlValue, namespaces = def)),
lat = as.numeric(xpathSApply(doc, "//d:storeDetail/d:latitude", xmlValue, namespaces = def)),
stringsAsFactors = FALSE
) -> stores