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

标签 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)

这些 xpathSApply 中的每一个都没有让我接近我的意图。应该如何着手构建一个格式良好的数据框架?

最佳答案

通常,我会建议尝试使用 xmlToDataFrame() 函数,但我相信这实际上相当棘手,因为它一开始就没有很好的结构。

我建议使用这个函数:

xmlToList(books)

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

一旦您决定了如何处理多作者问题,那么使用 plyr 中的 ldply() 函数(或仅使用 lapply并使用 do.call("rbind"...) 将返回值转换为 data.frame。

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

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 无法正确处理。 [否则,您可以将 lapplyrbind.fill 一起使用(也由 Hadley 提供),但是当 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>

关于xml - 如何将 XML 数据转换为 data.frame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2067098/

相关文章:

c - 删除 libxml2 c 中 xmldocument 和根节点之间的空白

r - 组合 R 中的列表元素

r - Shiny 的演示文稿 (ioslides) : Custom CSS and logo

r - ggplot2 geom_smooth 以变量为因子

java - Bean 验证 XML 整个 bean

java - 当我尝试使用切入点和通配符表达式创建 Bean 时,为什么会出现错误?

python - 从多索引 pandas 数据框中选择索引和列的子集

python - 如何使用 Python 清理 Excel 文件中的文本?

asp.net - 在被 WCF 类解析之前,如何在 IIS 中即时修改不正确的 XML header (编码)?

R:charToDate(x) 中的错误:字符串不是标准的明确格式