Ответ 1
Обычно я предлагаю попробовать функцию xmlToDataFrame()
, но я считаю, что это на самом деле будет довольно сложно, потому что это не так хорошо структурировано для начала.
Я бы рекомендовал работать с этой функцией:
xmlToList(books)
Одна из проблем заключается в том, что в книге есть несколько авторов, поэтому вам нужно будет решить, как с этим справиться, когда вы структурируете свой фрейм данных.
Как только вы решили, что делать с проблемой множественных авторов, достаточно просто перевести свой список книг в кадр данных с помощью функции ldply()
в plyr (или просто использовать 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
с rbind.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>