XML DOM XSLT 3章 XML文書を読む2
- 3.1. NodeList
- 3.2. Element
- 3.3. NamedNodeMap
3.3. NamedNodeMap
3.1.節では、子ノードの集合等をあらわす、NodeListインタフェースを紹介しました。ノードの集合を扱うインタフェースは、NodeListの他にNamedNodeMapがあります。NamedNodeMapはNodeのgetAttributes()メソッドの戻り値です。ある要素に属する、属性の集合を取得するときに使用します。
NamedNodeMapには、以下のメソッドが用意されています。
メソッド | 内容 |
---|---|
Node getNamedItem(String name) |
指定された名前のノードを取得します。 |
int getLength() | このマップ内のノード数です。 |
Node item(int index) | マップ内の index 番目の項目を返します。 |
NodeListと異なり、NamedNodeMapはNodeの順番を保持しません。「属性の順番に意味がない」というXMLの仕様を考えれば、当然ともいえます。NamedNodeMapにもitem()メソッドが存在しますが、indexによりどのNodeが返されるかは、特に保障されません。NamedeNodeMapを使用して、属性の値を取得するプログラムの例を示します。以下は、server.xmlの一部です。
1 <Server port="8005" shutdown="SHUTDOWN" debug="0"> 2 <Service name="Tomcat-Standalone"> 3 <Connector className="org.apache.catalina.connector.http.HttpConnector" 4 port="8080" minProcessors="5" maxProcessors="75" 5 enableLookups="true" redirectPort="8443" 6 acceptCount="10" debug="0" connectionTimeout="60000"/> ...
上記server.xmlから、接続設定を取得するプログラムは以下のようになります。
... 17 Element server=document.getDocumentElement(); 18 19 Node connector 20 =server.getElementsByTagName("Connector").item(0); 21 22 NamedNodeMap attributes=connector.getAttributes(); 23 String attrNames[]= 24 {"className","port","minProcessors", 25 "maxProcessors","enableLookups","debug"}; 26 27 for(int i=0;i<attrNames.length;i++){ 28 String msg=attrNames[i]+" value:"; 29 msg += attributes.getNamedItem(attrNames[i]).getNodeValue(); 30 System.out.println(msg); 31 } ・・・
22行目でConnectorノードのgetAttributes()メソッドを実行して、NamedNodeMapを取得しています。このNamedNodeMapには、Connector要素の属性の一覧がふくまれています。29行目で、NamedNodeMapのgetNamedItem()メソッドを実行しています。ここでは、属性の名前を指定してノードを取得しています。さらに、取得したノードのgetNodeValue()メソッドを呼び出すことにより、属性の値を取得し、表示しています。
(実習課題2)
以下のプログラムを作成しなさい。
- server.xmlファイルを読み込む
- Connector要素の全属性名を出力する
- 属性名の一覧を表示した後に、入力プロンプトを表示し、属性名を入力してもらう。
- 標準入力より入力された属性の値を出力する。