Java中的W3C DOM API,按名称获取子元素

ben*_*rre 15 java w3c dom

我刚刚意识到该方法Element.getElementsByTagName("someTagName")返回文档中具有给定标记名的所有元素的节点列表.如果我只想通过标签名称获取所有子元素怎么办?

例如...

<person>
  <name>Bob</name>
  <car>
    <name>Toyota Corolla</name>
  </car>
</person>
Run Code Online (Sandbox Code Playgroud)

Eng*_*uad 20

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;
}
Run Code Online (Sandbox Code Playgroud)


Uli*_*era 6

有同样的问题,但没有一个答案真正解决了这个问题。

我试图查询 WSDL 的 portType 节点内的操作节点,因为绑定节点也有操作。

<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>
Run Code Online (Sandbox Code Playgroud)

通过找到父级 (portTypes) 并将其从 Node 强制转换为 Element 并使用上面命名的方法来解决它。

Node portType = document.getElementsByTagName("portType").item(0);
NodeList operations = ((Element)portType).getElementsByTagName("operation");
Run Code Online (Sandbox Code Playgroud)

结果只给了我 INSIDE portType Node 的操作元素。


Faz*_*zal 3

getElementsByTagName总是在它被调用的元素的上下文中运行。如果调用 on Element,则只会访问给定标记名称的子元素。我认为您将此与Document对象 (org.w3c.dom.Document)getElementsByTagName方法混淆,然后将返回文档中给定标签名称的所有元素。

  • 恐怕这是不对的——这个方法返回后代元素,因此例如在表示 person 元素的 Element 上执行的 getElementsByTagName("name") 将返回 2 个节点。 (29认同)
  • @Pureferret 是的——两个节点:一个包含内容“Bob”,另一个包含“Toyota Corolla” (6认同)