How to create xml from R objects, e.g., is there a 'listToXml' function?

后端 未结 4 944
暗喜
暗喜 2020-11-30 08:52

R\'s XML package has an xmlToList function, but does not have the reverse, is there a function for R that will convert a list to an XML object?

I would like somethin

4条回答
  •  猫巷女王i
    2020-11-30 09:13

    Here is the listToXML function that we ended up creating

    At first I adapted the answer by @Jeff

    listToXml <- function(item, tag){
      if(typeof(item)!='list')
        return(xmlNode(tag, item))
      xml <- xmlNode(tag)
      for(name in names(item)){
        xml <- append.xmlNode(xml, listToXml(item[[name]], name))
      }
      return(xml)
    }
    

    But since the function has benefited from further development:

    ##' Convert List to XML
    ##'
    ##' Can convert list or other object to an xml object using xmlNode
    ##' @title List to XML
    ##' @param item 
    ##' @param tag xml tag
    ##' @return xmlNode
    ##' @export
    ##' @author David LeBauer, Carl Davidson, Rob Kooper
    listToXml <- function(item, tag) {
      # just a textnode, or empty node with attributes
      if(typeof(item) != 'list') {
        if (length(item) > 1) {
          xml <- xmlNode(tag)
          for (name in names(item)) {
            xmlAttrs(xml)[[name]] <- item[[name]]
          }
          return(xml)
        } else {
          return(xmlNode(tag, item))
        }
      }
    
      # create the node
      if (identical(names(item), c("text", ".attrs"))) {
        # special case a node with text and attributes
        xml <- xmlNode(tag, item[['text']])
      } else {
        # node with child nodes
        xml <- xmlNode(tag)
        for(i in 1:length(item)) {
          if (names(item)[i] != ".attrs") {
            xml <- append.xmlNode(xml, listToXml(item[[i]], names(item)[i]))
          }
        }    
      }
    
      # add attributes to node
      attrs <- item[['.attrs']]
      for (name in names(attrs)) {
        xmlAttrs(xml)[[name]] <- attrs[[name]]
      }
      return(xml)
    }
    

提交回复
热议问题