使用 R 生成 XML

Nod*_*101 2 xml r

我使用以下代码使用 R 生成 XML 文件。

# 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>
Run Code Online (Sandbox Code Playgroud)

这会生成一些非常接近我正在寻找的 XML。但是,因为我定义了一个复杂的前缀,所以我保留了开放的 XML 标记。如果您看一下这个示例,很容易看出我需要关闭“报告”标签。如何在 R 中将结束 XML 标记附加到此 xml 对象?

Par*_*ait 5

使用 XML 包,考虑使用prefix.xmlnewXMLNode ()添加节点:

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>
Run Code Online (Sandbox Code Playgroud)