Erhalte XML nur direkt untergeordnete Elemente nach Namen
Meine Frage ist: Wie bekomme ich Elemente, die direkt unter einem bestimmten übergeordneten element, wenn es um andere Elemente mit dem gleichen Namen wie ein "Enkelkind" des übergeordneten Elements.
Ich bin mit dem Java - DOM Bibliothek um XML zu Parsen Elemente und ich bin in Schwierigkeiten. Hier ist einige (einen kleinen Teil) der xml, die ich verwende:
<notifications>
<notification>
<groups>
<group name="zip-group.zip" zip="true">
<file location="C:\valid\directory\" />
<file location="C:\another\valid\file.doc" />
<file location="C:\valid\file\here.txt" />
</group>
</groups>
<file location="C:\valid\file.txt" />
<file location="C:\valid\file.xml" />
<file location="C:\valid\file.doc" />
</notification>
</notifications>
Wie Sie sehen können, gibt es zwei Orte, die Sie platzieren können <file>
element. Entweder in Gruppen oder außerhalb der Gruppen. Ich will es wirklich so strukturierter, weil es mehr Benutzer-freundlich.
Nun, immer wenn ich call notificationElement.getElementsByTagName("file");
es gibt mir alle <file>
Elemente, einschließlich solcher, die in der <group>
element. Ich handle jede dieser Arten von Dateien unterschiedlich, so dass diese Funktionalität nicht erwünscht ist.
Habe ich mir gedacht zwei Lösungen:
- Bekommen das Eltern-element der Datei-element und behandeln Sie entsprechend (je nachdem, ob es
<notification>
oder<group>
. - Benennen Sie die zweite
<file>
element, um Verwirrung zu vermeiden.
Keiner dieser Lösungen sind so wünschenswert wie nur, dass die Dinge so sind wie Sie sind und bekommen nur die <file>
Elementen, die direkte Kinder von <notification>
Elemente.
Ich bin offen für IMPO Kommentare und Antworten zu den "besten" Weg, dies zu tun, aber ich bin wirklich daran interessiert DOM - Lösungen, weil das ist, was der rest dieses Projekt verwendet. Danke.
InformationsquelleAutor der Frage kentcdodds | 2012-05-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich erkenne, dass du etwas gefunden, von einer Lösung dieser Mai @kentcdodds aber ich hatte gerade ein ziemlich ähnliches problem habe ich jetzt gefunden, denke ich (vielleicht in meinem Anwendungsfall, aber nicht in dir), ist eine Lösung.
ein sehr einfaches Beispiel meiner XML-format ist unten gezeigt:-
Wie Ihr hoffentlich sehen aus diesem snippet, das format, das ich will, haben kann, N-Niveaus der Verschachtelung für die [Beziehung] Knoten, so offensichtlich, das problem hatte ich mit Knoten.getChildNodes() war, dass ich immer alle Knoten aus allen Ebenen der Hierarchie, und ohne irgendeine Art von Hinweis auf Node-Tiefe.
Blick auf die API für eine Weile , ich merkte, dass es eigentlich zwei andere Methoden, die vielleicht von einigem nutzen sein:-
Zusammen, diese beiden Methoden schien alles zu bieten, was erforderlich war, um alle von der unmittelbaren untergeordneten Elemente eines Knoten. Die folgenden jsp-code geben sollte, eine Recht einfache Idee, wie man diese umzusetzen. Sorry für die JSP. Ich bin Rollen diese in eine bean jetzt aber nicht die Zeit haben, erstellen Sie eine voll funktionsfähige version von zerpflückt code.
Dieser code würde folgende Ausgabe zeigt nur die direkten Kind-Elemente des ersten root-Knoten.
Hoffe, das hilft trotzdem jemandem. Jubel für den ersten post.
InformationsquelleAutor der Antwort BizNuge
Sie XPath verwenden können für diese, mit Hilfe von zwei Weg, Sie zu erhalten und verarbeiten Sie anders.
Um die
<file>
Knoten direkt untergeordneten<notification>
verwenden//notification/file
und für diejenigen, die in<group>
verwenden//groups/group/file
.Dies ist ein einfaches Beispiel:
Es sollte die Ausgabe:
InformationsquelleAutor der Antwort Alex
Gut, die DOM-Lösung auf diese Frage ist eigentlich ziemlich einfach, auch wenn es nicht zu elegant, Wenn ich das Durchlaufen der
filesNodeList
wird zurückgegeben, wenn ich rufenotificationElement.getElementsByTagName("file");
ich nur überprüfen, ob der übergeordnete Knoten ist der name "Benachrichtigung". Wenn nicht dann Ignoriere ich es, denn das wird von den<group>
element. Hier ist mein code-Lösung:InformationsquelleAutor der Antwort kentcdodds
Wenn du dich mit dem DOM-API
Unsere erste Aufgabe ist es, ein element "Benachrichtigung" (in diesem Fall das erste Element (0)-) und alle seine Kinder:
(später können Sie arbeiten mit allen Elementen über alle Elemente).
Sich für jedes Kind "Notification":
sind Sie zum ersten mal Ihren Typ, um zu sehen, ob es ein element ist:
Wenn es der Fall ist, dann hast du deine Kinder "Datei" , das sind keine großen Kinder "Benachrichtigung"
und Sie können check them out:
und der Ausgang ist:
InformationsquelleAutor der Antwort arthur
Ich hatte das gleiche problem in einem meiner Projekte, und schrieb eine kleine Funktion, die zurück
List<Element>
enthält nur die unmittelbaren Kinder.Grundsätzlich prüft für jeden Knoten zurückgegeben
getElementsByTagName
wenn es parentNode ist tatsächlich der Knoten wir auf der Suche childs von:Die akzeptierte Antwort von kentcdodds zurückkehren werden falsche Ergebnisse (z.B. grandchilds), wenn es ein childnode namens "notification" - z.B. Rückkehr grandchilds, wenn das element "Gruppe" würde den Namen "Meldung". Ich konfrontiert war, dass das setup in meinem Projekt, das ist, warum ich kam mit meiner Funktion.
InformationsquelleAutor der Antwort Andy
Schrieb ich diese Funktion, um den Knoten mit dem Wert von tagName, einschränken zu top-level -
InformationsquelleAutor der Antwort Danimate
Stieß ich auf ein problem, wo ich brauchte, um zu verarbeiten, nur die unmittelbar untergeordneten Knoten, obwohl die Behandlung aller "Datei" - Knoten ist ähnlich. Für meine Lösung, ich Vergleiche das Element der übergeordnete Knoten mit der Knoten, der verarbeitet wird, um zu ermitteln, ob das Element eine sofortige Kind.
InformationsquelleAutor der Antwort KalenGi
Gibt es eine schöne LINQ-Lösung:
InformationsquelleAutor der Antwort ShibbyUK