我目前正在尝试用R解析气象xml文件。我在网上发现了很多答案,但似乎我的文件有点特别:
<?xml version="1.0" encoding="utf-8"?>
<current>
<city id="2643743" name="London">
<coord lon="-0.13" lat="51.51"/>
<country>GB</country>
<sun rise="2015-02-09T07:24:47" set="2015-02-09T17:04:38"/>
</city>
<temperature value="281.05" min="281.05" max="281.05" unit="kelvin"/>
<humidity value="80" unit="%"/>
<pressure value="1033.5" unit="hPa"/>
<wind>
<speed value="1" name="Calm"/>
<direction value="225" code="SW" name="Southwest"/>
</wind>
<clouds value="88" name="overcast clouds"/>
<visibility/>
<precipitation mode="no"/>
<weather number="804" value="overcast clouds" icon="04d"/>
<lastupdate value="2015-02-09T15:55:20"/>
</current>
如果分隔符像往常一样编写,例如坐标:
<coord>
<lon> "-0.13" </lon>
<lat> "51.51" </lat>
</coord>
这不是问题。但是,就我而言,我在解析树时遇到了一些麻烦。 我特别希望得到以下信息:温度,云层和湿度的值。到目前为止,我只是设法得到一个带有标题的表,而没有任何值。
我查看了互联网以找到解决方案,但我没有找到任何看起来像我的XML文件。
以前有人不得不处理类似的问题吗?
解析器的我的R代码如果有以下情况可以帮助:)。
files <- list.files(path="~/Desktop/R code/files", recursive="true")
parse_xml <-function(FileName) {
doc1 <- xmlParse(paste("~/Desktop/R code/files",FileName,sep="/"))
doc <- xmlToDataFrame(nodes=getNodeSet(doc1,"//current"))[c("temperature","humidity","clouds")]
}
Data <- ldply(files, parse_xml)
非常感谢!
答案 0 :(得分:1)
尽管rvest
包具有原始的网页抓取意图,但它也适用于XML运算,并且通常比xpath更容易理解* Apply`s。
library(XML)
library(rvest)
dat <- xmlParse('<?xml version="1.0" encoding="utf-8"?>
<current>
<city id="2643743" name="London">
<coord lon="-0.13" lat="51.51"/>
<country>GB</country>
<sun rise="2015-02-09T07:24:47" set="2015-02-09T17:04:38"/>
</city>
<temperature value="281.05" min="281.05" max="281.05" unit="kelvin"/>
<humidity value="80" unit="%"/>
<pressure value="1033.5" unit="hPa"/>
<wind>
<speed value="1" name="Calm"/>
<direction value="225" code="SW" name="Southwest"/>
</wind>
<clouds value="88" name="overcast clouds"/>
<visibility/>
<precipitation mode="no"/>
<weather number="804" value="overcast clouds" icon="04d"/>
<lastupdate value="2015-02-09T15:55:20"/>
</current>')
dat %>% xml_nodes(xpath="/current/temperature") %>% xml_attr("value")
## [1] "281.05"
dat %>% xml_nodes(xpath="/current/temperature") %>% xml_attr("min")
## [1] "281.05"
dat %>% xml_nodes(xpath="/current/temperature") %>% xml_attr("max")
## [1] "281.05"
dat %>% xml_nodes(xpath="/current/temperature") %>% xml_attr("unit")
## [1] "kelvin"
dat %>% xml_nodes(xpath="/current/clouds") %>% xml_attr("value")
## [1] "88"
dat %>% xml_nodes(xpath="/current/clouds") %>% xml_attr("name")
## [1] "overcast clouds"
您也可以对这些调用使用传统语法:
xml_attr(xml_nodes(dat, xpath="/current/temperature"), "value")