I am looking to import the following XML document into data frames:
<http://opensource.adobe.com/Spry/data/donuts.xml>

There should be 3 data frames created:

1. Items - (Fields = ID Type Name PPU)
2. Batters - (Fields = BatterID, BatterName, ItemID - key to Items data frame)
3. Toppings - (Fields = ToppingID, ToppingName, ItemID - key to Items data frame)

(Data does not need to be 3NF - i.e. each batter can be repeated for each item it is listed against)

Using the XML2 package, I have so far used the following code to import the XML and convert it to a nested list:

```
library(xml2)
xmlobj <- read_xml("http://opensource.adobe.com/Spry/data/donuts.xml")
ls1 <- as_list(xmlobj) #Converts XML to a nested list

```

I am now looking to parse / flatten the list into the 3 data frames as described above.

How best to achieve this? Is it through a series of loops (lapply/map), passing objects into vectors an then loading the data frame? Or should I avoid using XML2 / Lists altogether and use the XML package and achieve this using an XPath type syntax?

I tried the following and could pull out the Item attributes and elements for a single item, but when I tried to lapply the function it crashed:

```
#Function for pulling out item attributes from list
ItemDF <- function(myItem){

  #Gather Item data into DF including attributes
  itemFrame <- data_frame(
                id = attr(myItem$item,'id'),
                type = attr(myItem$item,'type'),
                name = unlist(myItem$item$name),
                ppu = unlist(myItem$item$ppu)
              )

  return(itemFrame)
}

#Single instance
df1 <- ItemDF(ls1$items[1])
df1

#Lapply across all items throws an error
lapply(ls1$items,ItemDF)

```

(NB This data set is a proof of concept, so I am looking for a method I can then adapt for other XML files that I expect to be working on).