web-dev-qa-db-ja.com

JavaのW3C DOM API、名前で子要素を取得

Element.getElementsByTagName("someTagName")メソッドが、指定されたタグ名を持つドキュメント内のすべての要素のノードリストを返すことに気づきました。タグ名ですべての子要素を取得したい場合はどうなりますか?

例えば...

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

getElementsByTagNameは常に、呼び出された要素のコンテキストで動作します。 Elementで呼び出された場合、指定されたタグ名の子要素のみがアクセスされます。これをDocumentオブジェクト(org.w3c.dom.Document)getElementsByTagNameメソッドと混同していると思います。そうすると、ドキュメント内の指定したタグ名のすべての要素が返されます。

1
Fazal
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;
}
22
Eng.Fouad

同じ問題がありましたが、実際に質問を解決した回答はありませんでした。

バインディングノードにも操作がある場合は、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のみ。

4
Ulises Layera

同様の問題がありました。代わりにNodeクラスを見てください。

http://Java.Sun.com/javase/6/docs/api/org/w3c/dom/Node.html#getChildNodes()

all直接の子ノードのリストを返す「getChildNodes」というメソッドがあります。次に、そのリストをフィルタリングして、正しいタグ名を持つ要素ノードのみを取得する必要があります。

3
Jesper Andersen

ドキュメント内のすべての要素ではありません—呼び出された要素のすべてのdescendant要素。それがあなたが望んでいるようです。右側のElementで呼び出す必要があります。 こちら を参照してください。

0
Syntactic