Element.getElementsByTagName("someTagName")
メソッドが、指定されたタグ名を持つドキュメント内のすべての要素のノードリストを返すことに気づきました。タグ名ですべての子要素を取得したい場合はどうなりますか?
例えば...
<person>
<name>Bob</name>
<car>
<name>Toyota Corolla</name>
</car>
</person>
getElementsByTagName
は常に、呼び出された要素のコンテキストで動作します。 Element
で呼び出された場合、指定されたタグ名の子要素のみがアクセスされます。これをDocument
オブジェクト(org.w3c.dom.Document)getElementsByTagName
メソッドと混同していると思います。そうすると、ドキュメント内の指定したタグ名のすべての要素が返されます。
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 Node内の操作ノードにクエリを実行しようとしました。
<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のみ。
同様の問題がありました。代わりにNodeクラスを見てください。
http://Java.Sun.com/javase/6/docs/api/org/w3c/dom/Node.html#getChildNodes()
all直接の子ノードのリストを返す「getChildNodes」というメソッドがあります。次に、そのリストをフィルタリングして、正しいタグ名を持つ要素ノードのみを取得する必要があります。
ドキュメント内のすべての要素ではありません—呼び出された要素のすべてのdescendant要素。それがあなたが望んでいるようです。右側のElement
で呼び出す必要があります。 こちら を参照してください。