我只是想创建一个xml文件到一个数据框架。我的文件很大,可能因为我得到一个错误,当我尝试这样做。错误如下:错误在[<-.data.frame
(*tmp*
, i, names(nodes[[i]]), value = c(graphics = ",:重复的下标为列我使用的代码是这样的:
breast_cancer <- xmlParse("breastcancerkegg.xml")
xmldaraframe <- xmlToDataFrame("breastcancerkegg.xml")
如果需要xml文件的样例,请参阅下面的genome.jp/pathway/hsa05224+H00031
<?xml version="1.0"?>
<!DOCTYPE pathway SYSTEM "https://www.kegg.jp/kegg/xml/KGML_v0.7.2_.dtd">
<!-- Creation date: Apr 11, 2018 17:05:28 +0900 (GMT+9) -->
<pathway name="path:hsa05224" org="hsa" number="05224"
title="Breast cancer"
image="https://www.kegg.jp/kegg/pathway/hsa/hsa05224.png"
link="https://www.kegg.jp/kegg-bin/show_pathway?hsa05224">
<entry id="2" name="path:hsa05224" type="map"
link="https://www.kegg.jp/dbget-bin/www_bget?hsa05224">
<graphics name="TITLE:Breast cancer" fgcolor="#000000" bgcolor="#FFFFFF"
type="roundrectangle" x="123" y="58" width="165" height="25"/>
</entry>
<entry id="6" name="hsa:2099 hsa:2100" type="gene"
link="https://www.kegg.jp/dbget-bin/www_bget?hsa:2099+hsa:2100">
<graphics name="ESR1, ER, ESR, ESRA, ESTRR, Era, NR3A1..." fgcolor="#000000" bgcolor="#BFFFBF"
type="rectangle" x="710" y="187" width="46" height="17"/>
</entry>
<entry id="7" name="hsa:2099 hsa:2100" type="gene"
link="https://www.kegg.jp/dbget-bin/www_bget?hsa:2099+hsa:2100">
<graphics name="ESR1, ER, ESR, ESRA, ESTRR, Era, NR3A1..." fgcolor="#000000" bgcolor="#BFFFBF"
type="rectangle" x="1041" y="187" width="46" height="17"/>
</entry>
<entry id="9" name="cpd:C00951" type="compound"
link="https://www.kegg.jp/dbget-bin/www_bget?C00951">
<graphics name="C00951" fgcolor="#000000" bgcolor="#FFFFFF"
type="circle" x="237" y="190" width="8" height="8"/>
</entry>
<entry id="11" name="hsa:1956" type="gene"
link="https://www.kegg.jp/dbget-bin/www_bget?hsa:1956">
<graphics name="EGFR, ERBB, ERBB1, HER1, NISBD2, PIG61, mENA" fgcolor="#000000" bgcolor="#BFFFBF"
type="rectangle" x="325" y="593" width="46" height="17"/>
</entry>
有什么想法吗?
这是对OP评论的回答:如何访问XML文档中的特定节点
我更喜欢xml2
库而不是XML
库。xml2小插图是推荐的阅读/参考材料。
了解数据格式
第一步是在XML浏览器或纯文本编辑器中打开文件,查看文档的结构。我们可以看到有一个pathway
节点,包含多个entry
和relation
节点。每个entry
节点包含一个graphics
节点,每个relation
节点包含一个subtype
节点。
正在加载XML文件
library(xml2)
xml <- read_xml('hsa05224.xml')
提取所有entry
节点
entries <- xml_find_all(xml, "/pathway//entry")
这里,路径中的/
指的是文档的根,//
用于将节点与其子节点分开。
entries
现在将是一个包含130个项目(节点)的列表。每个节点可以有多个属性和多个子节点。属性有一个唯一的名称,子属性可以有相同的名称。
从单个节点获取信息
> # print entire node
> entries[[1]]
{xml_node}
<entry id="2" name="path:hsa05224" type="map" link="https://www.kegg.jp/dbget-bin/www_bget?hsa05224">
[1] <graphics name="TITLE:Breast cancer" fgcolor="#000000" bgcolor="#FFFFFF" type="roundrectangle" x="123" y="58" width="165" height="25"/>
> # get node path
> xml_path(entries[[1]])
[1] "/pathway/entry[1]"
> # get vector of all attributes
> xml_attrs(entries[[1]])
id name type
"2" "path:hsa05224" "map"
link
"https://www.kegg.jp/dbget-bin/www_bget?hsa05224"
> # get specific attributes
> xml_attr(entries[[1]], 'name')
[1] "path:hsa05224"
> xml_attr(entries[[1]], 'link')
[1] "https://www.kegg.jp/dbget-bin/www_bget?hsa05224"
> # get node name
> xml_name(entries[[1]])
[1] "entry"
> # get all sub-nodes inside node
> kids <- xml_children(entries[[1]])
在最后一步中,我们提取了所有子节点,我们可以对每个子节点再次执行相同的操作,例如:
> xml_path(kids[[1]])
[1] "/pathway/entry[1]/graphics"
> xml_attrs(kids[[1]])
name fgcolor bgcolor type x y
"TITLE:Breast cancer" "#000000" "#FFFFFF" "roundrectangle" "123" "58"
width height
"165" "25"
> xml_name(kids[[1]])
[1] "graphics"
手动从这些文档中提取数据主要涉及大量的for()
和/或lapply()
调用。