在R中解析xml文件

时间:2015-02-09 16:41:06

标签: xml r xml-parsing

我目前正在尝试用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)

非常感谢!

1 个答案:

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