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

lar*_*rus 34 xml r dataframe

我正在努力学习R的XML包装.我正在尝试从books.xml示例xml数据文件创建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)
Run Code Online (Sandbox Code Playgroud)

这些xpathSApply中的每一个都没有让我接近我的意图.如何进入格式良好的数据框架?

Sha*_*ane 39

通常情况下,我建议尝试使用该xmlToDataFrame()功能,但我相信这实际上相当棘手,因为它的结构不合理.

我建议使用这个功能:

xmlToList(books)
Run Code Online (Sandbox Code Playgroud)

一个问题是每本书有多个作者,因此在构建数据框时需要决定如何处理.

一旦你决定如何解决多个作者的问题,那么将你的书籍列表变成一个数据框就可以了,这个ldply()函数在plyr中(或者只是使用lapply并使用do将返回值转换为data.frame) .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
Run Code Online (Sandbox Code Playgroud)

这是包含作者的样子.您需要ldply在此实例中使用,因为列表是"锯齿状的"... lapply无法正确处理.[否则,你可以用lapplyrbind.fill(也礼貌哈德利的),但何必时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>
Run Code Online (Sandbox Code Playgroud)

  • "但是,为什么plyr会自动为你做这件事呢?" 我发现自己说了很多. (7认同)
  • @ user2006697链接被移动到:"http://www.w3schools.com/xsl/books.xml" (2认同)