将xml / html文档中的元素强制转换为data.frame

时间:2016-08-14 10:34:10

标签: r xml rvest

假设您在R中有一个文档,格式如下:

<grp>
<elementx>
  <sub_a>a</sub_a>
  <sub_b>b</sub_b>
  <sub_c>c</sub_c>
</elementx>
<elementx>
  <sub_a>1</sub_a>
  <sub_b>2</sub_b>
  <sub_c>3</sub_c>
</elementx>
</grp>

将这些强制转换为data.frame的最优雅方式是什么,即。相当于以下..?

data.frame(sub_a = c('a',1), sub_b = c('b',2), sub_c = c('c',3))
  sub_a sub_b sub_c
1     a     b     c
2     1     2     3

它不是一个html表,但由于所有元素共享相同的简单内部格式,我们应该能够像表格一样对待它们。

1 个答案:

答案 0 :(得分:2)

如果xml已经是一个简单的结构,可以使用xmlToDataFrame()从XML包轻松转换,如下所示:

library(XML)

xmlstr <- 
"<grp>
  <elementx>
    <sub_a>a</sub_a>
    <sub_b>b</sub_b>
    <sub_c>c</sub_c>
  </elementx>
  <elementx>
    <sub_a>1</sub_a>
    <sub_b>2</sub_b>
    <sub_c>3</sub_c>
  </elementx>
</grp>"  

df <- xmlToDataFrame(xmlstr)
df
#  sub_a sub_b sub_c
#1     a     b     c
#2     1     2     3

如果xml在文件中而不是字符串中,那么您可以使用它:

xmlstr <- readLines("test.xml")
df <- xmlToDataFrame(xmlstr)

如果你想直接从一个http地址获取你的xml,(就像在你的问题的评论中那样),那么这个工作

doc = readLines('https://www.gov.uk/government/announcements.atom?announcement_filter_option=statements&topics%5B%5D=transport')
df2 <- xmlToDataFrame(doc)

如果您正在处理转换速度很慢的非常大的xml文件,this blog post描述了您可以尝试在github上托管的更快的函数:require(devtools); install_github("processVISION", "muschellij2")