Ich möchte bestimmte Daten aus einer XML-Datei in einen R-Datenframe extrahieren. Ich möchte die Daten später dazu verwenden, digitalisierte Stiftbewegungen mit einem Anoto-Stift zu rekonstruieren. Bisher mache ich das mit der Bibliothek rvest. R & XML - Zuweisen von Daten zu korrekten übergeordneten Knoten, die in einem Datenrahmen gleich benannt sind
library(rvest)
file <- read_xml("1.xml")
#The interesting data is in the stroke nodes.
stroke <- xml_nodes(file, "stroke")
#One example for extracting data I am interested in.
bounds <- xml_nodes(stroke, "bounds")
x <- xml_text(xml_nodes(bounds, "x"))
y <- xml_text(xml_nodes(bounds, "y"))
width <- xml_text(xml_nodes(bounds, "width"))
height <- xml_text(xml_nodes(bounds, "height"))
#Putting this data into a Dataframe.
df <- data.frame(x, y, width, height)
So weit so gut (Beispiel XML-Datei kann unten). Mein Problem sind jetzt die <sample>
Knoten. Ich habe eine minimale Anzahl von <stroke>
Knoten in den XML-Dateien, bis zu ca. gehen. 100 bei max. Jeder <stroke>
Knoten hat seine eigenen <sample>
Knoten. Ich möchte die X-, Y- und Zeitdaten aus den Beispielknoten extrahieren, so dass ich sie dem entsprechenden Strich im Datenrahmen zuordnen kann. Zum Beispiel, wenn ich
mysamples <- xml_nodes(stroke, "sample")
nur erhalte ich alle Proben aus allen Schlägen, aber ich habe zwischen unterschiedlichen Hüben zu unterscheiden. Ich dachte daran, eine Funktion zu schreiben, die eine For-Schleife verwendet, um über die verschiedenen Striche zu iterieren, aber ich konnte das nicht in Gang bringen.
Hier ist eine verkürzte XML-Datei Beispiel mit zwei <stroke>
Knoten.
<?xml version="1.0" encoding="UTF-8" ?>
<page>
<UnassignedStrokes>
<starttime>1459867893629</starttime>
<endtime>1459867896812</endtime>
<stroke>
<starttime>1459867893629</starttime>
<endtime>1459867894815</endtime>
<linewidth>1.0</linewidth>
<color>-14090101</color>
<bounds>
<x>260.0</x>
<y>750.0</y>
<width>217.0</width>
<height>18.0</height>
</bounds>
<sample>
<x>260.625</x>
<y>766.0</y>
<time>1459867893629</time>
<force>108</force>
</sample>
<sample>
<x>260.625</x>
<y>763.625</y>
<time>1459867893722</time>
<force>120</force>
</sample>
<sample>
<x>262.875</x>
<y>762.0</y>
<time>1459867893775</time>
<force>122</force>
</sample>
</stroke>
<stroke>
<starttime>1459867895892</starttime>
<endtime>1459867896812</endtime>
<linewidth>1.0</linewidth>
<color>-14090101</color>
<bounds>
<x>364.0</x>
<y>701.0</y>
<width>10.0</width>
<height>125.0</height>
</bounds>
<sample>
<x>364.5</x>
<y>701.0</y>
<time>1459867895892</time>
<force>32</force>
</sample>
<sample>
<x>366.0</x>
<y>702.0</y>
<time>1459867895905</time>
<force>106</force>
</sample>
<sample>
<x>367.25</x>
<y>702.625</y>
<time>1459867895958</time>
<force>120</force>
</sample>
</stroke>
</UnassignedStrokes>
</page>
Ich schätze jede Hilfe!
Momentan erfasst der Datenrahmen von bounds keinen Strich. Benötigen Sie zwei Datenrahmen: Grenzen und Stichproben mit Strichdaten, die als Spalten gekennzeichnet sind? In XML sind beide Geschwister zueinander. Bitte zeigen Sie das gewünschte Endergebnis an. – Parfait