Iterieren verschachtelten XML-Elemente, die mit Ruby-Nokogiri
Ich versuche Durchlaufen einer Ordner-Struktur in XML mit Nokogiri, aber ich bin stecken in diesem:
<test>
<folder name="Folder A">
<folder name="Folder A1">
<file name="a.txt">Cool file</file>
</folder>
<folder name="Folder A2"></folder>
</folder>
<folder name="Folder B">
<folder name="Folder B1"></folder>
<folder name="Folder B2">
<folder name="Folder B21">
<file name="b.txt"></file>
</folder>
</folder>
</test>
So, ich will zu Durchlaufen, damit Sie in der Lage, erstellen einen Baum von Ordnern und Dateien (Ordner A1 und A2 drin sind Ordner A, Ordner B1 und B2 sind innen Ordner B und Ordner B21 innen Ordner B2).
So, ich bin dabei:
nodes = allnodes.xpath('//folder')
nodes.each do |node|
puts "name => #{node.attributes['name']}"
end
aber das listet mir alle Ordner (A, A1, A2, B, B1, B2, B21). Wie kann ich es so machen, dass ich nicht prüfen Sie im vorherigen Ordner weitere Ordner und ich sende es dann an die gleiche rekursive Funktion?
Vielen Dank für die Hilfe 🙂
- Du fragst, wie man nur die Unterordner eines bestimmten Ordner? Zum Beispiel, wenn Sie angegeben haben, "Ordner A", Sie würden nur "A1" und "A2"?
- Schöne xml-Struktur.. +1
- Was meinst du mit "Wie kann ich es so machen, dass ich nicht prüfen Sie im vorherigen Ordner weitere Ordner"? Die
//folder
gibt Sie jeden Ordner genau einmal. Was versuchen Sie zu tun? - Ich beantwortete die Fragen unten 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie eine XPath-mit
//foo
finden Siefoo
Elemente auf jeder Ebene. Wenn Sie stattdessen./foo
oder nurfoo
dann finden Sie nur die Kind-Elemente. Also:Die Schlüssel dazu sind (a) die Rekursion (mit der Methode sich selbst aufrufen für alle untergeordneten Ordner), und (b) die Erfassung der block übergeben, indem der Benutzer mit der
&blk
- notation, und klicken Sie dann vorbei, die block zusammen, um die spätere Anrufe.In Aktion gesehen:
Ergebnis:
Ich tun würde, wie folgt :
Nun, Sie haben einen hash
parent_directory
, die verwaltet alle auf ein Verzeichnis(Taste)/sub-directories(Wert) Beziehung. Jetzt mitHash#[]
- Methode können Sie leicht extrahieren Sie die Unterverzeichnisse eines bestimmten Verzeichnisses. Ein Beispiel -Es ist ein wenig unklar, was Sie zu tun versuchen, aber sagen wir mal Sie erstellen eine neue Verzeichnis Struktur auf der Festplatte auf einem Linux-system.
Hier ist, was das bedeutet:
So, ich habe später herausgefunden, wie es zu lösen.
Nur um zu klären, ich soll eine Funktion haben wie diese:
Damit ich replizieren kann, die Struktur habe ich im xml-Format das Dateisystem.
So, in Bezug auf die Lösung, es war direkt vor meinen Augen. Ich konnte nicht verwenden "//Ordner", sondern "/Ordner", die als erste zurückkehren wird, alle Ordner, unabhängig von Ihrem Platz in der xml-Struktur, und die zweite wird erst dann wieder diejenigen, die in der root-Knoten des aktuellen Knotens.
Ich hoffe das hilft und vielen Dank für alle Antworten. Ich werde Sie ausprobieren, sobald ich kann.