如何将XML数据转换为data.frame?

我正在学习R的XML包。 我试图从books.xml示例xml数据文件创build一个data.frame。 这是我得到的:

 library(XML) books <- "http://www.w3schools.com/XQuery/books.xml" doc <- xmlTreeParse(books, useInternalNodes = TRUE) doc xpathApply(doc, "//book", function(x) do.call(paste, as.list(xmlValue(x)))) xpathSApply(doc, "//book", function(x) strsplit(xmlValue(x), " ")) xpathSApply(doc, "//book/child::*", xmlValue) 

这些xpathSApply中的每一个都不会让我接近我的意图。 应该如何进行一个良好的数据框?

One Solution collect form web for “如何将XML数据转换为data.frame?”

通常,我会build议尝试xmlToDataFrame()函数,但我相信这实际上是相当棘手的,因为它不是很好的结构开始。

我会build议使用这个function:

 xmlToList(books) 

一个问题是,每本书有多个作者,所以当你构build数据框架时,你需要决定如何处理。

一旦你决定了如何处理多个作者问题,那么使用plyr中的ldply()函数将你的书籍列表变成一个数据框是相当直接的(或者只是使用lapply并将返回值转换为data.frame通过使用do.call(“rbind”…)。

这是一个完整的例子(不包括作者):

 library(XML) books <- "w3schools.com/xsl/books.xml" library(plyr) ldply(xmlToList(books), function(x) { data.frame(x[!names(x)=="author"]) } ) .id title.text title..attrs year price .attrs 1 book Everyday Italian en 2005 30.00 COOKING 2 book Harry Potter en 2005 29.99 CHILDREN 3 book XQuery Kick Start en 2003 49.99 WEB 4 book Learning XML en 2003 39.95 WEB 

以下是作者所包含的内容。 你需要在这个实例中使用ldply ,因为这个列表是“锯齿状的”… lapply无法正确处理。 (否则你可以用lapply (也是Hadley提供的)使用lapply ,但是为什么plyr自动为你做这件事呢?]:

 ldply(xmlToList(books), data.frame) .id title.text title..attrs author year price .attrs 1 book Everyday Italian en Giada De Laurentiis 2005 30.00 COOKING 2 book Harry Potter en J K. Rowling 2005 29.99 CHILDREN 3 book XQuery Kick Start en James McGovern 2003 49.99 WEB 4 book Learning XML en Erik T. Ray 2003 39.95 WEB author.1 author.2 author.3 author.4 1 <NA> <NA> <NA> <NA> 2 <NA> <NA> <NA> <NA> 3 Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 4 <NA> <NA> <NA> <NA> 
  • 什么是xs:NCNametypes,什么时候应该使用?
  • 从WebRequest中嘲笑WebResponse
  • jQuery xml错误'没有'Access-Control-Allow-Origin'标题出现在请求的资源上。
  • 将XML文件读入XmlDocument
  • 具有多个条件的XPath
  • 正在写元素的自闭标签不传统上是空的坏习惯?
  • JAXB:如何编组列表中的对象?
  • XSLT / XPath中的当前节点与上下文节点?
  • select包含“foo”的属性的正确XPath是什么?
  • SimpleXML和print_r() - 为什么这是空的?
  • 最喜欢的内容在webview上没有正确显示