将 XML 解析为 R 数据框

use*_*212 4 xml xpath r

我一直试图将一个大的 xml 文件解析为一个 R - data.frame 对象。xml 具有以下架构:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?eclipse version="3.0"?>
  <ROOT>
  <row>
    <field name="dtcreated"></field>
    <field name="headline"></field>
    <subheadline/>
    <field name="body"></field>
  </row>
  <row>
    <field name="dtcreated"></field>
    <field name="headline"></field>
    <subheadline/>
    <field name="body"></field>
  </row>
</ROOT>
Run Code Online (Sandbox Code Playgroud)

plyr 便利功能没有帮助,因为无法验证 xml。所以我想出了以下代码,使用 xpath 查询:

adHocXml<-xmlTreeParse(adHocXmlPath,getDTD = FALSE)
adHocRoot<-xmlRoot(adHocXml)
creationDateColumn<-sapply(getNodeSet(adHocRoot,"//row//field[@name='dtcreated']"), xmlValue)
headlineColumn<-sapply(getNodeSet(adHocRoot,"//row//field[@name='headline']"), xmlValue)
bodyColumn<-sapply(getNodeSet(adHocRoot,"//row//field[@name='body']"), xmlValue)
adHocData<-data.frame(creationDate=creationDateColumn,headline=headlineColumn,body=bodyColumn)
Run Code Online (Sandbox Code Playgroud)

该代码完全符合我对短文件的期望。但是,对于一个大文件和数千个行标签,大约 10 分钟后我收到以下错误:

Error: 1: internal error: Huge input lookup
2: Extra content at the end of the document 
Run Code Online (Sandbox Code Playgroud)

谁能帮我?

jdh*_*son 5

libxml单个节点的大小有上限。您可以通过启用解析器标志来关闭此限制XML_PARSE_HUGE。在R包中,XML您可以这样做:

library(XML)
xmlParse(myXML, options = HUGE)
Run Code Online (Sandbox Code Playgroud)

您可能还想查看xmlEventParse. Martin Morgan 在这里提供了一个很好的例子来说明它的使用