将XML标记属性值解析为R中的数据帧

将XML标记属性值解析为R中的数据帧,xml,r,parsing,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> <l

我有一个.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"/>
wpt_id   link_id
  1       1235
mediate   4572
mediate   4084
  2       6884
  3       7462
  4       7462
mediate   9528

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

如果有1个链接和0到多个wpt,则可以从链接节点和join获取wpt和链接ID的列表

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个链接和0到多个wpt,则可以从链接节点和join中获取wpt和链接ID的列表

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

nodes这里是一个使用
XML
库和
xpathsaply
函数的解决方案

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() }))
库(XML)

links这里是一个使用
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() }))
库(XML)

链接感谢您的输入@克里斯遇到了另一个问题,不知道怎么做。如果可能,请提供Plz帮助指南。没有wpt标记的节点是空的,因此只需将它们替换为
wpt[sapply(wpt,length)==0]谢谢!这就是我的想法,只是不知道如何实施…非常感谢你!谢谢你的意见@克里斯遇到了另一个问题,不知道怎么做。如果可能,请提供Plz帮助指南。没有wpt标记的节点是空的,因此只需将它们替换为
wpt[sapply(wpt,length)==0]谢谢!这就是我的想法,只是不知道如何实施…非常感谢你!谢谢你的帮助,这很有效,但Chris只是稍早回答了@Psidon谢谢你的帮助,这很有效,但Chris只是稍早回答了@普西登