前のブログで取り上げた、パラメータと値のとりかたについてです。
前回はタグ名だけをとってきましたが、今回は、タグ名のほかに、属性やテキストの値もとってきます。
入力は、前回と同じです。
一応、その内容を出力してみました。
なお、このプログラムでは、一番最後の子供のタグにのみ、テキスト項目を持つ形になっています。
テキスト項目が任意のタグのところに入るようにするためには、拡張が必要です。
次回以降に話すと思います。
■■ プログラム
■■ 結果
#tag:testClass
#child:YES
extends:absClass
#val:[{#tag=komoku1, #child=NO, #val=9999}, {#tag=komoku2, #child=NO, arrays=*, #val=XXX}, {#tag=komoku3, type=long, #child=NO, #val=null}]
このプログラムで使った、属性、値の取得メソッドなどの説明については、次回以降にします(ながくなるから)。
今日のお題 |
---|
XMLを読み込み、ハッシュマップにいれよう |
前回はタグ名だけをとってきましたが、今回は、タグ名のほかに、属性やテキストの値もとってきます。
入力は、前回と同じです。
ハッシュマップへの入れ方 | |
---|---|
キー | 値 |
---|---|
#tag | タグ名 |
#child | 子供があればYES、なければNO |
#val | 子供があるとき Vector vectorの1要素は、子供1つ分のハッシュマップ ハッシュマップの構造は、この構造 子供がテキストのとき<tag>文字列</tag>のとき その文字列 子供がなかったら<tag/>の形 null |
それ以外 (アトリビュート名) | アトリビュートの値 |
一応、その内容を出力してみました。
なお、このプログラムでは、一番最後の子供のタグにのみ、テキスト項目を持つ形になっています。
テキスト項目が任意のタグのところに入るようにするためには、拡張が必要です。
次回以降に話すと思います。
■■ プログラム
import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import java.util.*; public class xmlReadTest { static String inFname = "testClass.xml"; public static void main(String[] args) { try { //----------------------------------------------// // Dom取得のためのお決まりの部分 // //----------------------------------------------// // 入力ファイルを読み込み、Documentオブジェクトを取得 Document doc = DocumentBuilderFactory.newInstance() .newDocumentBuilder().parse(new File(inFname)); //----------------------------------------------// // クラス名となる、ルート要素を取得して表示 // //----------------------------------------------// Node root = doc.getDocumentElement(); HashMap mp = null; // XMLをハッシュマップに入れる mp = nodeToHashMap(root); // ハッシュマップの内容を、表示する String[] key = (String[])mp.keySet().toArray(new String[0]); for(int j = 0 ; j < key.length ; j ++) { System.out.println(key[j] + ":" + mp.get(key[j])); } } catch (Exception e) { e.printStackTrace(); } } /** * ノードの中身を取得して、ハッシュマップに入れる * @param oneNode ハッシュマップに入れるノード */ private static HashMap nodeToHashMap(Node oneItem) { HashMap ret = new HashMap(); // 子ノードがあるかないか if ( oneItem.hasChildNodes() == true ) { NodeList chNode = oneItem.getChildNodes(); if ( ( chNode.getLength() == 1 ) && ( chNode.item(0).getNodeType() == Node.TEXT_NODE)) { // 子ノードが1個で、それはテキスト=<tag>val</tag>の形 ret.put("#tag",oneItem.getNodeName()); ret.put("#val",chNode.item(0).getNodeValue()); ret.put("#child","NO"); } else { // 子ノードがいっぱいある<tag><chtag>aaa</chtag><tag> ret.put("#child","YES"); ret.put("#tag",oneItem.getNodeName()); Vector chVec = new Vector(); for (int j= 0 ; j < chNode.getLength(); j++) { if ( chNode.item(j).getNodeType() == Node.ELEMENT_NODE) { HashMap chMp = nodeToHashMap(chNode.item(j)); chVec.add(chMp); } } ret.put("#val",chVec); } } else { // 子ノードはない ret.put("#tag",oneItem.getNodeName()); ret.put("#val",null); ret.put("#child","NO"); } // アトリビュートの設定 if ( oneItem.hasAttributes() == true) { NamedNodeMap attr = oneItem.getAttributes(); for (int j = 0 ; j < attr.getLength(); j ++ ) { Node para = attr.item(j); ret.put(para.getNodeName(),para.getNodeValue()); } } return ret; } }
■■ 結果
#tag:testClass
#child:YES
extends:absClass
#val:[{#tag=komoku1, #child=NO, #val=9999}, {#tag=komoku2, #child=NO, arrays=*, #val=XXX}, {#tag=komoku3, type=long, #child=NO, #val=null}]
このプログラムで使った、属性、値の取得メソッドなどの説明については、次回以降にします(ながくなるから)。