R的XML包有一个xmlToList函数,但没有反过来,是否有一个R函数将列表转换为XML对象?
我想要的东西
listToXML(list('a'))
Run Code Online (Sandbox Code Playgroud)
返回
<a></a>
Run Code Online (Sandbox Code Playgroud)
但我能找到的最接近的是
library(XML)
xmlNode(list('a'))
Run Code Online (Sandbox Code Playgroud)
返回
</a>
Run Code Online (Sandbox Code Playgroud)
帮助解决这个问题,并理解R对象到XML的转换(XML包)似乎更侧重于使用R来读取XML,而对创建XML的支持较少.
更新......我无法弄清楚的一个原因是因为我没有意识到尾随'/' <node/>
表示空节点,相当于<node></node>
And*_*rie 16
该函数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
Run Code Online (Sandbox Code Playgroud)
导致:
<a>
<b x="1" y="abc"/>
<c>With some text</c>
</a>
Run Code Online (Sandbox Code Playgroud)
Jef*_*len 16
我很惊讶没有任何功能已经存在 - 当然已经有一些已经打包的东西了.
无论如何,我使用以下脚本来完成此任务:
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)
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以使用XML :: saveXML()函数将其作为字符抓取.
这是listToXML
我们最终创建的功能
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)
}
Run Code Online (Sandbox Code Playgroud)
但是由于该功能受益于进一步的发展:
##' 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)
}
Run Code Online (Sandbox Code Playgroud)