在 R 中解析 xml 文件

Parsing xml file in R

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

不会有问题的。但是,就我而言,我在解析树时遇到了一些麻烦。 我特别想获得以下信息:温度值、云层值和湿度值。到目前为止,我只是设法得到一个带有 headers 的 table 而没有任何值。

我上网查找解决方案,但没有找到任何与我的 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)

非常感谢!

尽管 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")