这里使用的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>
可以看到,在根节点底下有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)))