我正在尝试使用XML包在R中构建XML文件。 (我对此很陌生,甚至我仍然了解XML文件的不同组件,这使事情变得有些复杂)。第一步非常简单:
#Create XML file
doc_beast <- newXMLDoc()
root <- newXMLNode("beast", doc = doc_beast)
#Write taxa node
taxaNode <- newXMLNode("taxa", parent = root, attrs = c(id="taxa"))
taxa <- getNodeSet(doc_beast, "//beast/taxa")
for(i in 1:nrow(metadata)) {
newXMLNode("taxon", parent = taxa)
}
doc_beast
输出为:
<?xml version="1.0"?>
<beast>
<taxa id="taxa">
<taxon/>
<taxon/>
<taxon/>
</taxa>
</beast>
如您所见,节点'taxa'具有多个子节点,它们共享相同的名称('taxon')。但是每个孩子应该具有不同的属性。因此,我的管道应该给出如下输出:
<?xml version="1.0"?>
<beast>
<taxa id="taxa">
<taxon/> id="sp_1">
<taxon/> id="sp_2">
<taxon/> id="sp_3">
</taxa>
</beast>
但是我做错了。我试图在循环中添加一条通用命令以从数据帧中提取良好的信息,但我不知道该怎么做。
for(i in 1:nrow(metadata)) {
newXMLNode("taxon", parent = taxa, attrs = c(id="i[,1]"))
}
数据框是这样的:
species_name <- c('sp1', 'sp2', 'sp3')
lat <- c(-3.16, -0.56, -2.1)
long <- c(-59.90, -52.57, -60.2)
metadata <- data.frame(species_name,lat,long)
非常感谢您的帮助。非常感谢!
L
调用newXMLNode
时,可以传递attrs=
属性来设置节点上的属性。所以你可以做
for(i in 1:nrow(metadata)) {
newXMLNode("taxon", parent = taxa,
attrs = list(id=as.character(metadata$species_name[i])))
}
这将返回
<?xml version="1.0"?>
<beast>
<taxa id="taxa">
<taxon id="sp1"/>
<taxon id="sp2"/>
<taxon id="sp3"/>
</taxa>
</beast>