2010-04-14 96 views
12

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

例如...

<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 2010-12-13 13:39:10

+0

感谢您指出 – Fazal 2010-12-14 19:19:47

+17

恐怕这是不正确的 - 此方法返回后代元素,因此例如''Element''上执行的'getElementsByTagName(“name”)''表示person元素将返回2个节点。 – 2012-03-29 15:50:11

1

没有在文档中的所有元素 - 这就是所谓的元素的所有后代元素。这听起来就是你想要的。你只需要在右边的Element上打电话。请参阅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

处的节点。在我的情况中,我发现修改if条件也是有帮助的检查localName:if(child instanceof Element && (name.equals(child.getLocalName())|| name.equals(child.getNodeName()))){ – benvolioT 2013-04-11 18:10:44

3

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

我试图查询操作节点INSIDE的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),只是从节点浇铸到元并使用上述命名的方法来解决它。

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

这给了我作为结果操作元素INSIDE portType节点只。