2016-04-18 10 views
0

Ich möchte verstehen, warum ich folgendes, wenn ich ein bestimmtes Element Wert während XML-Analyse zugreifen möchten zu tun haben:Warum hat Node keinen getElementByTagName()?

NodeList controlList = poDoc.getElementsByTagName("control"); 
    Node controlNode = controlList.item(0); 
    Element controlElem = (Element) controlNode; 

    usageType = controlElem.getElementsByTagName("usage_type").item(0).getFirstChild().getNodeValue(); 

Hier habe ich die ControlNode zu (Element) zu werfen, nur weil ich will, um auf ein anderes Element tiefer im DOM-Baum zuzugreifen. Das funktioniert alles wie erwartet, ich möchte nur verstehen, warum das so ist. Warum kann es keinen getElementByTagName oder ähnlichen Aufruf für das Node-Objekt geben? Oder ist es und ich weiß es einfach nicht. Da ich ziemlich neu in Java bin, könnte dies der Fall sein. Dafür gibt es sicherlich einen besseren Grund als "weil so die Schnittstelle implementiert wurde".

Antwort

1

Nur Dokumente und Elemente können Elemente enthalten.

So sind die Designer des DOM API simpy entschieden die Methode getElementsByTagName nur in den Node Klassen Document und Element zu definieren.

Eine alternative Konstruktion würdegetElementsByTagName in der Node Klasse und zurück eine leere Knotenliste, wenn der Knoten nicht die Elemente definieren wurden, enthalten können. (Dies ist ungefähr die Designentscheidung, die von der XPath-Spezifikation getroffen wurde).

+0

Danke, der Sinn macht. Akzeptierte Antwort für die XPath-Referenz. – jackthehipster

1

Nach dem Javadoc, Node ist jede Daten, die in einem XML-Dokument existieren können, einschließlich Kommentare, Header und Text (Textwert von XML-Element), so dass nicht alle Arten von Knoten einen "Namen" haben können oder habe Kindelemente.

Ein Element definiert die Arten von Knoten, die untergeordnete Elemente haben können, die durch einen Namen zurückerlangt werden können.

1

Nach XML-Standards ist jede Entität in einem XML-Dokument eine Node, und nicht alles in einem XML-Dokument kann untergeordnete Elemente enthalten. Der Parser kann nicht wissen, ob ein referenzierter Node ein Header, ein Element oder sogar ein Kommentar ist. Daher wäre es unklug, eine solche Methode zu verwenden, ohne zuerst den Typ zu überprüfen.

Auch wenn Sie Ihre XML erwarten eine gewisse Art und Weise formatiert werden, ist es üblich, zu überprüfen, ob ein Node ist eigentlich ein Element, zum Beispiel:

if(node instanceof Element) { 
    NodeList usagetypes = ((Element)node).getElementsByTagName("usage_types"); 
    ... 
Verwandte Themen