我有一个.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函数,将其转换为列表,但不知道如何继续。任何帮助将不胜感激!
答案 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() }))