2010-04-14 2 views
12

Я только понял, что метод Element.getElementsByTagName("someTagName") возвращает нодлист всех элементов документа, имеющих данный тэг. Что делать, если я просто хочу получить все дочерние элементы по имени тега?W3C DOM API в Java, получить дочерние элементы по имени

Например ...

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

ответ

3

getElementsByTagName всегда работает в контексте элемента, который он назвал. Если вызывается на Element, будут доступны только дочерние элементы по имени указанного тега. Я думаю, вы сбиваете с толку это с помощью метода Document (org.w3c.dom.Document) getElementsByTagName, тогда все элементы по имени тега в документе будут возвращены.

+0

Это getElement ** s ** ByTagName. – stefanw

+0

Спасибо за указание – Fazal

+17

Я боюсь, что это неправильно: этот метод возвращает элементы-потомки, поэтому, например, 'getElementsByTagName (" name ")', выполненный в элементе 'Элемент', представляющем человека, вернет 2 узла. –

1

Не все элементы в документе - все потомок элементы элемента он призвал. Похоже, это то, что вы хотите. Вам просто нужно позвонить ему справа Element. См. here.

2

У меня была аналогичная проблема. Попробуйте взглянуть на класс Node вместо:

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

Существует метод, называемый «getChildNodes», который возвращает список всех прямых дочерних узлов. Затем вам нужно отфильтровать этот список, чтобы получить только узлы-элементы с правильным тэгом.

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

В моем случае я счел полезным изменить условие if, чтобы также проверьте localName: if (child instanceof Element && (name.equals (child.getLocalName()) || name.equals (child.getNodeName()))) { – benvolioT

3

Имеет ту же проблему, но ни один из ответов на самом деле не решил вопрос.

Я пытался запросить операции Узлы ВНУТРИ узла portType узла WSDL, учитывая, что узел привязки также имеет операции.

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

решаемые его нахождения родителя (portTypes) и просто бросая его от узла к элементу и используя метод, названный выше.

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

Который дал мне в результате элементы операции INSIDE portType Node.

Смежные вопросы