Как создать 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>
Ответы
Ответ 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)
}