我有一个.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落在同一个链接上。所以我想要的输出是这样的数据框架:
wpt_id link_id
1 1235
mediate 4572
mediate 4084
2 6884
3 7462
4 7462
mediate 9528
我想使用XML包。尝试了getNodeSet函数,将其转换为list,但不知道如何继续。任何帮助都将不胜感激!
发布于 2016-05-04 20:56:25
如果您有1链接和0到多个wpt,您可以从链接节点获得wpt和链接ids的列表并进行连接。
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
我必须从最后一个链接中删除/>。
doc <- xmlParse('<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></xml>')
发布于 2016-05-04 21:09:59
下面是一个使用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() }))
https://stackoverflow.com/questions/37037248
复制相似问题