Java中的W3CDOMAPI,按名称获取子元素

Java中的W3CDOMAPI,按名称获取子元素,java,dom,w3c,Java,Dom,W3c,我刚刚意识到方法Element.getElementsByTagName(“someTagName”)返回文档中具有给定标记名的所有元素的节点列表。如果我只想按标记名获取所有子元素,该怎么办 例如 <person> <name>Bob</name> <car> <name>Toyota Corolla</name> </car> </person> 上下快速移动 丰田花冠 不是

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

例如

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

上下快速移动
丰田花冠

不是文档中的所有元素—调用它的元素的所有子元素。听起来这就是你想要的。您只需要在右边的
元素上调用它。请参阅。

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

我遇到了类似的问题。请尝试查看节点类:


有一个名为“getChildNodes”的方法,它返回所有直接子节点的列表。然后,您需要筛选该列表,以仅获取具有正确标记名的元素节点。

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

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;
}
我试图查询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>

结果,它只给了我portType节点内的操作元素。

它是getElementsByTagName。恐怕这不对——此方法返回子元素,例如
getElementsByTagName(“名称”)
在表示person元素的
元素上执行时将返回2个节点。@ArturNowak我不懂。它返回哪两个?包含“Bob”和“Toyota Corolla”的
节点?@Pureferret没错——两个节点:一个包含“Bob”,另一个包含“Toyota Corolla”,最糟糕的是我们不能依赖节点顺序。第一个节点并不总是“第一个直接子节点”。如果在元素“/person/car”之后有元素“/person/name”,那么“Toyota Corolla”将是索引(0)处的节点。在我的例子中,我发现修改If条件以同时检查localName:If(元素的子实例&&(name.equals(child.getLocalName())| name.equals(child.getNodeName())){
Node portType = document.getElementsByTagName("portType").item(0);
NodeList operations = ((Element)portType).getElementsByTagName("operation");