Nodedeveloper101
Nodedeveloper101

Reputation: 441

Generating XML with R

I'm generating an XML file with R using the following code..

# R 
prefix.xml <- "<reports>
  <report type='standard'>
    <data> xxx </data>
    <data> xxx </data>
    <data> xxx </data>
  </reports>"

# dummy data.frame
df <- data.frame("xxx","yyy")

# buid XML Tree
xml <- xmlTree()
xml$addTag("report", close=FALSE, attrs=c(type="enhanced"))
xml$addTag("pages", close=FALSE)
for (i in 1:nrow(df)) {
  xml$addTag("page", close=FALSE)
  for (j in names(df)) {
    xml$addTag(j, df[i, j])
  }
  xml$closeTag()
}
xml$closeTag()
xml$closeTag()

# view XML generated
cat(saveXML(xml, prefix = prefix.xml))

# <reports>
#   <report type='standard'>
#     <data> xxx </data>
#     <data> xxx </data>
#     <data> xxx </data>
#   </report>
# <report type="enhanced">
#   <pages>
#     <page>
#       <X.xxx.>xxx</X.xxx.>
#       <X.yyy.>yyy</X.yyy.>
#     </page>
#   </pages>
# </report>

This generates some XML thats really close to what I'm looking for. However, because I'm defining a complex prefix I'm leaving open XML tags. If you look at this example it's easy to see that I need to close the "reports" tag. How do I append a closing XML tag to this xml object in R ?

Upvotes: 3

Views: 6314

Answers (1)

Parfait
Parfait

Reputation: 107587

Using the XML package, consider adding nodes to the prefix.xml using newXMLNode():

library(XML)

# XML STRING 
prefix.xml <- "<reports>
                  <report type='standard'>
                    <data> xxx </data>
                    <data> xxx </data>
                    <data> xxx </data>
                  </report>     
               </reports>"

# DUMMY DATA FRAME
df <- data.frame("xxx","yyy")

# BUILD XML TREE
doc = xmlTreeParse(prefix.xml, useInternalNodes = T)     # PARSE STRING
root = xmlRoot(doc)                                      # FIND ROOT

reportNode = newXMLNode("report", parent=root)           # ADD TO ROOT
xmlAttrs(reportNode) = c(type = "enhanced")              # ADD ATTRIBUTE
pagesNode = newXMLNode("pages", parent=reportNode)       # ADD TO REPORT

for (i in 1:nrow(df)){
  pageNode = newXMLNode("page", parent=pagesNode)        # ADD PAGE FOR EACH RECORD
  for (j in 1:nrow(df)){
    newXMLNode("X.xxx.", df$X.xxx.[i], parent=pageNode)  # ADD COL/ROW VALUE
    newXMLNode("X.yyy.", df$X.yyy.[i], parent=pageNode)  # ADD COL/ROW VALUE
  }  
}

# VIEW XML
print(doc)

# SAVE XML TO FILE
saveXML(doc, file="OutputFile.xml")

#<?xml version="1.0"?>
#<reports>
#  <report type="standard">
#    <data> xxx </data>
#    <data> xxx </data>
#    <data> xxx </data>
#  </report>
#  <report type="enhanced">
#    <pages>
#      <page>
#        <X.xxx.>xxx</X.xxx.>
#        <X.yyy.>yyy</X.yyy.>
#      </page>
#    </pages>
#  </report>
#</reports>

Upvotes: 6

Related Questions