【问题标题】:Parsing xml file in R在R中解析xml文件
【发布时间】:2015-02-09 16:41:05
【问题描述】:

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

非常感谢!

【问题讨论】:

    标签: xml r xml-parsing


    【解决方案1】:

    尽管 rvest 包的原始网络抓取意图,它也适用于 XML 处理,并且通常比 xpath*Apply 更容易理解。

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

    【讨论】:

    • 太棒了!这正是我一直在寻找的。对于这些小操作,rvest 包比 XML 包更容易使用。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2015-08-26
    • 2011-05-18
    • 2017-12-22
    • 2016-11-17
    • 2011-03-06
    • 2013-07-17
    相关资源
    最近更新 更多