【发布时间】:2011-02-08 01:46:26
【问题描述】:
我刚刚意识到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>
【问题讨论】:
并非文档中的所有元素——调用它的元素的所有后代元素。听起来这就是你想要的。您只需要在右侧调用它Element。见here。
【讨论】:
getElementsByTagName 总是在它被调用的元素的上下文中运行。如果在Element 上调用,则只会访问给定标签名称的子元素。
我认为您将此与Document 对象(org.w3c.dom.Document)getElementsByTagName 方法混淆了,然后将返回文档中给定标签名称的所有元素。
【讨论】:
Element上执行的getElementsByTagName("name")会返回2个节点。
node?
我遇到了类似的问题。尝试查看 Node 类:
http://java.sun.com/javase/6/docs/api/org/w3c/dom/Node.html#getChildNodes()
有一个名为“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>
通过找到父级 (portTypes) 并将其从 Node 转换为 Element 并使用上面提到的方法来解决它。
Node portType = document.getElementsByTagName("portType").item(0);
NodeList operations = ((Element)portType).getElementsByTagName("operation");
结果只给了我操作元素 INSIDE portType Node。
【讨论】: