使用R从CSV文件创建xml文件

MSM

我正在尝试使用CSV文件中的XML包创建xml文件。我的CSV文件如下所示:

>head(patient)
  Source         Target             weight
1 Bacteroides   Lachnospiraceae  3.80735493
2 Bacteroides        Klebsiella -1.61890983
3 Bacteroides Lachnoclostridium  3.80735493
4 Bacteroides     Streptococcus -1.77760758
5 Streptococcus   Clostridium    1.19264508
6 Streptococcus [Eubacterium]    5.58496251

我的愿望输出xml应该如下所示:

<?xml version="1.0" encoding="iso-8859-1"?>
<gxl>
    <graph id="graph id= ExtendedCallGraph edgeids=true edgemode=undirected">
        <node id="1">
            <attr name="Bacteroides">
            </attr>
        </node>
        <edge from="Bacteroides" to="Lachnospiraceae" isdirected="False" id="1--2">
        </edge>
        <edge from="Bacteroides" to=" Klebsiella" isdirected="False" id="1--2">
        </edge>
        <edge from="Bacteroides" to="Lachnoclostridium" isdirected="False" id="1--3">
        </edge>
        <edge from="Bacteroides" to=" Streptococcus" isdirected="False" id="1--4">
        </edge>
        <node id="2">
            <attr name="Streptococcus">
            </attr>
        </node>
        <edge from="Streptococcus" to="Clostridium" isdirected="False" id="2--3">
        </edge>
          <edge from="Streptococcus" to="Eubacterium" isdirected="False" id="2--4">
        </edge>
        :
        :
        :
        :
    </graph>
 </gxl>

我尝试了以下代码:

DD = xmlHashTree()
top1<-addNode(xmlNode("gxl"), character(), DD)
addNode(xmlNode("graph id= ExtendedCallGraph edgeids=true edgemode=directed"),top1,DD,close=FALSE)

lapply(unique(patient_1$Source),function(x){
  b=addNode(xmlNode("node",attrs = c('id' = as.integer(x))),top1,DD)
  c=addNode(xmlNode("attr",attrs = c('name' = as.character(x))),b,DD)})

   #####I am trying to add edge node from source to Target########
    apply(unique(patient_1[,1:2]),1,function(x){
  e=addNode(xmlNode("edge",attrs = c("from"= as.character(patient_1$Source[1]), 
                    "to"=as.character(patient_1$target[1]), isdirected="false")),top1,DD)})

但是我被困在这一点上。我如何将源列设置为“从”属性,将目标列设置为“至”属性。我该如何实现?提前致谢

完善

考虑一个更简单的嵌套for循环,该循环遍历每个唯一的及其子集的观测值。与应用族解决方案相反,您可以保留所需@id属性的迭代数并扩展XML树。另外,请考虑使用此newXMLNode方法attrs为属性构建元素及其参数,在其中使用c()

# CREATE XML FILE
doc = newXMLDoc()
root = newXMLNode("gxl", doc = doc)
graph = newXMLNode("graph", parent = root,
                   attrs = c(id="ExtendedCallGraph", edgeids="true", edgemode="directed"))

# WRITE XML NODES AND DATA
sources <- unique(patient$Source)

for(i in seq_along(sources)){
  # NODE nodes
  grp_node = newXMLNode("node", parent = graph, attrs=c(name=i))
  attr_node = newXMLNode("attr", sources[i], parent = grp_node)

  sub_df <- subset(patient, Source == sources[i])

  # EDGE nodes
  for(j in 1:nrow(sub_df)){
    edge_node = newXMLNode("edge", parent=graph,
                           attrs=c(from=sub_df$Source[j], to=sub_df$Target[j],
                                   isdirected="False", id=paste0(i, '--', j)))
  }
}    

# OUTPUT XML CONTENT TO SCREEN
print(doc)

# OUTPUT XML CONTENT TO FILE
saveXML(doc, file="Output.xml")

输出量

print(doc)    
# <?xml version="1.0"?>
# <gxl>
#   <graph id="ExtendedCallGraph" edgeids="true" edgemode="directed">
#     <node name="1">
#       <attr>Bacteroides</attr>
#     </node>
#     <edge from="Bacteroides" to="Lachnospiraceae" isdirected="False" id="1--1"/>
#     <edge from="Bacteroides" to="Klebsiella" isdirected="False" id="1--2"/>
#     <edge from="Bacteroides" to="Lachnoclostridium" isdirected="False" id="1--3"/>
#     <edge from="Bacteroides" to="Streptococcus" isdirected="False" id="1--4"/>
#     <node name="2">
#       <attr>Streptococcus</attr>
#     </node>
#     <edge from="Streptococcus" to="Clostridium" isdirected="False" id="2--1"/>
#     <edge from="Streptococcus" to="[Eubacterium]" isdirected="False" id="2--2"/>
#   </graph>
# </gxl>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章