W3C DOM API в Java, получить дочерние элементы по имени - PullRequest
15 голосов
/ 14 апреля 2010

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

Например ...

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

Ответы [ 5 ]

20 голосов
/ 16 октября 2012
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;
}
4 голосов
/ 04 мая 2016

Была такая же проблема, но ни один из ответов на самом деле не решил вопрос.

Я пытался запросить узлы операций ВНУТРИ узла 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.

3 голосов
/ 02 июня 2010

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

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

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

0 голосов
/ 14 апреля 2010

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

0 голосов
/ 14 апреля 2010

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

...