添加带引号的属性– R中的XML

问题描述 投票:0回答:1

我正在尝试使用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

r xml loops
1个回答
0
投票

调用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>
© www.soinside.com 2019 - 2024. All rights reserved.