2010-04-14 10 views
12

Me acabo de dar cuenta de que el método Element.getElementsByTagName("someTagName") devuelve una lista de nodos de todos los elementos en el documento que tienen un nombre de etiqueta determinado. ¿Qué sucede si solo quiero obtener todos los elementos secundarios por nombre de etiqueta?W3C DOM API en Java, obtenga elementos secundarios por nombre

Por ejemplo ...

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

Respuesta

3

getElementsByTagName siempre funciona en el contexto del elemento al que se llama. Si se llama al Element, solo se accederá a los elementos secundarios por el nombre de etiqueta especificado. Creo que está confundiendo esto con el método Document objeto (org.w3c.dom.Document) getElementsByTagName, luego se devolverán todos los elementos por el nombre de etiqueta proporcionado en el documento.

+0

Es getElement ** s ** ByTagName. – stefanw

+0

Gracias por señalarlo – Fazal

+17

Me temo que no está bien - este método devuelve elementos descendientes, por ejemplo 'getElementsByTagName (" nombre ")' ejecutado en el elemento de persona 'Element' que representa devolverá 2 nodos. –

1

No todos los elementos del documento - todos los descendientes elementos del elemento que se llama sucesivamente. Parece que eso es lo que quieres. Solo necesita llamarlo a la derecha Element. Ver here.

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

En mi caso, me pareció útil modificar la condición si también compruebe el localName: if (child instanceof Element && (name.equals (child.getLocalName()) || name.equals (child.getNodeName()))) { – benvolioT

3

Tenía el mismo problema, pero ninguna de las respuestas resolvió la pregunta.

Estaba tratando de consultar los Nodos de operación DENTRO del nodo portType de un WSDL, dado que el nodo vinculante también tiene operaciones.

<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> 

lo resolvió mediante la búsqueda de los padres (portTypes) y acaba de lanzarlo desde el nodo de elemento y utilizando el método arriba mencionado.

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

Lo que me dio como resultado los elementos de operación INSIDE portType Node only.

Cuestiones relacionadas