2016-05-04 7 views
0

ich eine XML-Datei haben, sieht wie folgt aus:Parse XML-Tag-Wert in Datenrahmen Attribut in 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"/> 

Voll Datei hier finden könnte: full file Grundsätzlich ist der Link ohne Umbau Zwischenglieder ist. Und eine Verbindung mit mehreren Mitteln bedeutet, dass diese auf dieselbe Verbindung fallen. Also die Ausgabe, die ich will, ist ein Datenrahmen wie folgt:

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

Ich möchte das XML-Paket verwenden. Versuchte die getNodeSet-Funktion, konvertiere sie in eine Liste, weiß aber nicht weiter. Jede Hilfe würde sehr geschätzt werden!

Antwort

1

Wenn Sie 1 Verbindung und 0 zu viele Wpts haben, könnten Sie eine Liste von Wpt und Link-IDs von den Link-Knoten erhalten und beitreten.

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 

Ich hatte das /> aus dem letzten Link

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

Vielen Dank für Ihre Eingabe! @Chris –

+0

Ich habe ein anderes Problem, keine Ahnung, wie Sie das tun. Plz Hilfe führen, wenn möglich. –

+0

Knoten ohne ein wpt-Tag sind leer, also ersetzen Sie sie einfach mit 'wpt [sapply (wpt, length) == 0] <-" mediate "' (bevor Sie 'n <-' oben erhalten). –

1

Hier ist eine Lösung für sie mit XML Bibliothek und xpathSApply Funktion zu entfernen.

+0

Danke für Ihre Hilfe, es funktioniert aber Chris hat nur ein wenig früher geantwortet. @Psidon –