2010-04-14 4 views
12

Ich habe gerade festgestellt, dass die Methode Element.getElementsByTagName("someTagName") eine Nodelist aller Elemente im Dokument zurückgibt, die einen gegebenen Tagnamen haben. Was ist, wenn ich alle untergeordneten Elemente nur nach Tag-Namen abrufen möchte?W3C DOM API in Java, untergeordnete Elemente nach Namen erhalten

Zum Beispiel ...

<person> 
    <name>Bob</name> 
    <car> 
    <name>Toyota Corolla</name> 
    </car> 
</person> 

Antwort

3

getElementsByTagName arbeitet immer im Zusammenhang mit dem aufgerufenen Element. Bei Aufruf von Element würde nur auf untergeordnete Elemente mit dem angegebenen Tag-Namen zugegriffen werden. Ich denke, Sie verwechseln dies mit Document Objekt (org.w3c.dom.Document) getElementsByTagName Methode, dann werden alle Elemente durch den angegebenen Tag-Namen im Dokument zurückgegeben.

+0

Es ist getElement ** s ** ByTagName. – stefanw

+0

Danke dafür, darauf hingewiesen zu werden – Fazal

+17

Ich fürchte, das ist nicht richtig - diese Methode gibt Nachkommen-Elemente zurück, so zum Beispiel 'getElementsByTagName (" Name ")' ausgeführt auf dem Element Element repräsentiert 2 Knoten. –

1

Nicht alle Elemente im Dokument - alle Nachkommen Elemente des Elements auf genannt wird. Es klingt wie das, was du willst. Sie müssen nur auf der rechten Seite Element anrufen. Siehe here.

2

Ich hatte ein ähnliches Problem. Versuchen Sie, bei der Node-Klasse suchen statt:

http://java.sun.com/javase/6/docs/api/org/w3c/dom/Node.html#getChildNodes()

Es gibt eine Methode „getChildNodes“ genannt, die die Liste der alle direkt untergeordneten Knoten zurückgibt. Sie müssen diese Liste dann filtern, um nur die Elementknoten mit dem richtigen Tagnamen zu erhalten.

16
public static Element getDirectChild(Element parent, String name) 
{ 
    for(Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) 
    { 
     if(child instanceof Element && name.equals(child.getNodeName())) return (Element) child; 
    } 
    return null; 
} 
+1

In meinem Fall fand ich es hilfreich, die if-Bedingung auch zu ändern Überprüfen Sie den lokalenName: if (untergeordnete Instanz des Elements && (name.equals (child.getLocalName()) || name.equals (child.getNodeName()))) { – benvolioT

3

Hatte das gleiche Problem, aber keine der Antworten tatsächlich die Frage gelöst.

Ich habe versucht, die Operation Knoten INSIDE der PortType-Knoten einer WSDL abzufragen, da der Bindeknoten auch Operationen haben.

<portType name="MyService"> 
    <operation name="op1"> 
     <input wsam:Action="http://somedomain.org/MyService/MyServiceRequest" message="tns:MyServiceRequest"/> 
     <output wsam:Action="http://somedomain.org/MyService/MyServiceResponse" message="tns:MyServiceResponse"/> 
    </operation> 
    ... 
</portType> 
<binding name="MyServicePortBinding" type="tns:MyService"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
    <operation name="op1"> 
     <soap:operation soapAction=""/> 
     <input> 
     <soap:body use="literal"/> 
     </input> 
     <output> 
     <soap:body use="literal"/> 
     </output> 
    </operation> 
</binding> 

es wurde gelöst durch die Eltern (porttypes) zu finden und es nur von Knoten zu Element Gießen und das Verfahren oben genannten verwenden.

Node portType = document.getElementsByTagName("portType").item(0); 
NodeList operations = ((Element)portType).getElementsByTagName("operation"); 

Das gab mir als Ergebnis die Operation Elemente INSIDE PortType Node nur.

Verwandte Themen