使用R语言将XML转换为CSV

这里使用的xml文件为CASOS提供的数据集company.xml

首先分析xml文件,截取一段xml代码

 1 <DynamicNetwork>    
 2 <MetaNetwork>        
 3 <nodes>            
 4 <nodeclass type="agent" id="agent">                
 5 <node id="LDR" title="Project Manager" />                
 6 <node id="Mgr1" title="Art Director" />                
 7 </nodeclass>                     
 8 <nodeclass type="task" id="task">                
 9 <node id="T1" title="Project Management" />                
10 <node id="T2" title="Administration" />                       
11 </nodeclass>        
12 </nodes>        
13 <networks>            
14 <network sourceType="agent" targetType="agent" id="agent x agent">                
15 <link source="LDR" target="Mgr1" type="double" value="1.0000" />                
16 <link source="LDR" target="Mgr2" type="double" value="1.0000" />                
17 </network>           
18 </DynamicNetwork>    
19 </MetaNetwork>    
View Code

可以看到,在根节点底下有nodes和network两大类,需要提取的是在nodes这个节点下id和title的属性值,network节点下source和target的值,确定需要用到的组成csv文件的属性后,开始对xml文件进行处理。

①首先在R中加载xml包,读取xml文件

# Load the package required to read XML files.
library("XML");

# Also load the other required package.
library("methods");

# Give the input file name to the function.
xmlfile <- xmlParse(file="company.xml")

②找到根节点,确定所需要的属性值在哪个节点下

#找到根节点
xmltop = xmlRoot(xmlfile) 
# 得到id=agent类的node目录
#xmltop[[1]][[1]][[1]]
# 得到id=knowledge类的node目录
#xmltop[[1]][[1]][[2]]
# 得到id=task类的node目录
#xmltop[[1]][[1]][[3]]
#得到id=agent x agent类的network目录
#xmltop[[1]][[2]][[1]]
#得到id=agent x knowledge类的network目录
#xmltop[[1]][[2]][[2]]
#得到id=agent x task类的network目录
#xmltop[[1]][[2]][[3]]

 ③初始化一个向量,存储id的值,在最后将得到的几个向量组成一个数据框dataframe。

  由于没有找到R中相关的函数,所以自己写了一个repeat循环

  构造getNodeId函数,获得node的id属性值

#定义节点的id向量,初始化,存储节点的id属性值
nodes_id <- vector()

getNodeId <- function(index){
  #初始化向量nodes_id_temp,存储当前参数下获得的节点的id值
  nodes_id_temp <- vector()
  #初始化i
  i<-1
  #获得当前节点总数
  n <- xmlSize(xmltop[[1]][[1]][[index]]) 
  repeat{
    temp=xmlGetAttr(xmltop[[1]][[1]][[index]][[i]],name="id") 
    nodes_id_temp[i] <- temp
    #print(nodes_id_temp[i])
    i<-i+1
    if (i > n)
      break;  
  }
  nodes_id <<- c(nodes_id,nodes_id_temp)
}

  调用函数得到文件的所有id属性值。

  类似的方法可以得到所有上文中提到的属性值,分别存储在向量nodes_id,nodes_title,net_source以及net_target中。

④最后创建数据框存储数据,并且输出csv文件

#创建数据框
nodes <- data.frame(name=nodes_id,title=nodes_title,id=1:length(nodes_id))
edges <- data.frame(source=net_source,target=net_target)

#输出csv文件
write.csv(nodes, file = "nodes.csv", row.names = F, quote = F)
write.csv(edges, file = "edges.csv", row.names = F, quote = F)

  

附加:

在后续的操作中,将字符串转换为id即整数更加方便计算

则利用match函数对edges数据框进行操作

edges <- data.frame(source=net_source,target=net_target)
edges <- data.frame(source=c(match(edges[,1],nodes_id)),
                    target=c(match(edges[,2],nodes_id)))

  

 

  

转载于:https://www.cnblogs.com/franose/p/6839505.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值