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