将XML标记属性值解析为R中的数据帧
我有一个.xml文件,如下所示:将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
<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只是稍早回答了@普西登