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

Coerce elements in xml/html document to data.frame

假设您在 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 table,但由于所有元素共享相同的简单内部格式,我们应该能够像 table..[=15 一样对待它们=]

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

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