2016-05-04 55 views
0

我有一個.xml文件,如下所示:解析XML標籤屬性值到數據幀中的R

<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 基本上沒有標籤的鏈接是中間環節。而且多個鏈接意味着這些wpt會落在同一鏈接上。所以我想要的輸出是這樣的數據框:

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

我想使用XML包。嘗試getNodeSet函數,將其轉換爲列表,但不知道如何繼續。任何幫助將不勝感激!

回答

1

如果您有1個鏈接和0到多個wpt,您可以從鏈接節點和連接中獲得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 

我不得不刪除/>從最後一個環節

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>') 
+0

感謝您的輸入!@Chris –

+0

我遇到了另一個問題,不知道該怎麼做。如果可能,請參閱Plz幫助指南 –

+0

沒有wpt標籤的節點是空的,所以只需將它們替換爲'wpt [sapply(wpt,length)== 0] < - 「mediate」'(在獲得'n <-'之前)。 –

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() })) 
+0

感謝您的幫助,它很有效,但克里斯剛剛回答了一點。 @Psidon –