将XML解析为R中的data.frame

时间:2014-07-16 17:27:23

标签: xml r

对此有很多疑问,但无法找到适合此数据格式的解决方案。感谢有关如何解析此问题的建议:

<XML>
<constituency hansard_id="5" id="uk.org.publicwhip/cons/1" fromdate="1918" todate="9999-12-31">
    <name text="Aberavon"/>
</constituency>
<constituency hansard_id="6" id="uk.org.publicwhip/cons/2" fromdate="1997-05-01" todate="2005-05-04">
    <name text="Aberdeen Central"/>
</constituency>
<constituency hansard_id="7" id="uk.org.publicwhip/cons/3" fromdate="1885" todate="9999-12-31">
    <name text="Aberdeen North"/>
</constituency>
</XML>

所需的字段显然是c('hansard_id','id','fromdate','todate','name')。读入并解析我尝试了以下内容:

require(XML)
> indata = htmlParse('data.xml', isHTML=F)
> class(indata)
[1] "XMLInternalDocument" "XMLAbstractDocument"
> print(indata)
<?xml version="1.0"?>
<XML>
  <constituency hansard_id="5" id="uk.org.publicwhip/cons/1" fromdate="1918" todate="9999-12-31">
    <name text="Aberavon"/>
  </constituency>
  <constituency hansard_id="6" id="uk.org.publicwhip/cons/2" fromdate="1997-05-01" todate="2005-05-04">
    <name text="Aberdeen Central"/>
  </constituency>
  <constituency hansard_id="7" id="uk.org.publicwhip/cons/3" fromdate="1885" todate="9999-12-31">
    <name text="Aberdeen North"/>
  </constituency>
</XML>

> xmlToDataFrame(indata, stringsAsFactors=F)
  name
1     
2     
3     

它正在读取,但是xmlToDataFrame无法处理格式。是因为数据是'constituency'标签元素的属性吗?非常感谢任何指导。

1 个答案:

答案 0 :(得分:2)

您是正确的xmlToDataFrame仅访问XML个节点。对于给定节点,xmlAttrs函数将返回该节点属性。 xpathApply函数使用解析的xml文档doc说并向其应用xpath以获取一组节点。然后将这些节点中的每一个应用于用户定义的功能。 xpath "//*/constituency"将返回文档中的所有constituency个节点。然后,我们可以将xmlAttrs函数应用于每个函数:

res <- xpathApply(doc, "//*/constituency", xmlAttrs)

这将返回一个属性列表。我们想将这些绑定在一起,例如:

rbind.data.frame(res[[1]], res[[2]], ...)

将第一个和第二个,第三个......属性集绑定到data.frame中。这样做的一个简单方法是在属性列表中使用do.call函数:

do.call(rbind.data.frame, res)

将行绑定应用于列表中的所有元素。