Подтвердить что ты не робот

Как создать xml из объектов R, например, есть ли функция listToXml?

R XML пакет имеет функцию xmlToList, но не имеет обратного, есть ли функция для R, которая преобразует список к объекту XML?

Мне хотелось бы что-то вроде

listToXML(list('a'))

который возвращает

<a></a>

но ближайший я могу найти

library(XML)
xmlNode(list('a'))

который возвращает

</a>

помощь по этому вопросу и понимание преобразования объектов R в XML в целом оценены (в пакете XML больше внимания уделяется использованию R для чтения XML с меньшей поддержкой для создания XML).

Обновление... Одна из причин, по которой я не мог понять этого, состоит в том, что я не понимал, что конечный "/" в <node/> указывает пустой node, эквивалентный <node></node>

4b9b3361

Ответ 1

Функция newXMLNode выполняет то, что вам нужно, т.е. записывает вывод XML. Подробнее см. Подробную справку и примеры в ?newXMLNode. Вот краткий отрывок:

library(XML)    
top = newXMLNode("a")
newXMLNode("b", attrs=c(x=1, y='abc'), parent=top)
newXMLNode("c", "With some text", parent=top)
top

Результат:

<a>
  <b x="1" y="abc"/>
  <c>With some text</c>
</a> 

Ответ 2

Я удивлен, что для этого уже не существует никакой функции - наверняка там уже что-то уже упаковано.

Несмотря на это, я использую следующий script, чтобы выполнить следующее:

root <- newXMLNode("root")
li <- list(a = list(aa = 1, ab=2), b=list(ba = 1, bb= 2, bc =3))
listToXML <- function(node, sublist){
    for(i in 1:length(sublist)){
        child <- newXMLNode(names(sublist)[i], parent=node);

        if (typeof(sublist[[i]]) == "list"){
            listToXML(child, sublist[[i]])
        }
        else{
            xmlValue(child) <- sublist[[i]]
        }
    } 
}
listToXML(root, li)

Вы можете использовать функцию XML:: saveXML(), чтобы захватить это как символ, если хотите.

Ответ 3

Вот функция listToXML, в результате которой мы создали

Сначала Я адаптировал ответ 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)
}

Но так как функция воспользовалась из дальнейшей разработки:

##' 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)
}