将XML标记属性值解析为R

时间:2016-05-04 20:16:56

标签: xml r parsing

我有一个.xml文件,如下所示:

<link dst="7456" id="1235">
 <wpt id="1" x="33442"/>
</link>
<link dst="4553" id="4572"/>
<link dst="6222" id="4084"/>
<link dst="3451" id="6884">
 <wpt id="2" x="33442"/>
</link>
<link dst="9374" id="7462"/>
 <wpt id="3" x="84733"/>
 <wpt id="4" x="49473"/>
</link>
<link dst="4310" id="9528"/>

可在此处找到完整档案: full file 基本上没有标签的链接是中间链接。一个链接多个意味着那些wpts属于同一个链接。所以我想要的输出是这样的数据框:

wpt_id   link_id
  1       1235
mediate   4572
mediate   4084
  2       6884
  3       7462
  4       7462
mediate   9528

我想使用XML包。尝试了getNodeSet函数,将其转换为列表,但不知道如何继续。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

如果您有1个链接和0到多个wpts,您可以从链接节点获取wpt和链接ID列表并加入。

   access_token = auth.authenticate_instance()

我不得不删除/&gt;从最后一个链接

nodes<- getNodeSet(doc, "//link")
link <- lapply(nodes, xmlGetAttr, "id")
wpt <- lapply(nodes, xpathSApply, "./wpt", xmlGetAttr, "id")
n <- sapply(wpt, length)
data.frame( wpt_id = unlist(wpt),  link_id= rep(unlist(link), n))

  wpt_id link_id
1      1    1235
2      2    6884
3      3    7462
4      4    7462

答案 1 :(得分:1)

以下是使用XML库和xpathSApply函数的解决方案。

library(XML)
links <- xpathSApply(xmlInternalTreeParse(file.xml), "//link", saveXML)
getId <- function(link, type) {
       xpathSApply(xmlInternalTreeParse(link), 
                   paste("//", type, sep = ""), xmlGetAttr, "id")
}
do.call(rbind, lapply(links, function(link) {
              wptId = getId(link, "wpt") 
              linkId = getId(link, "link") 
              if(length(wptId) != 0) 
                  data.frame(wpt_id = wptId, link_id = linkId) 
              else 
                  data.frame() }))