設定ファイルの参照
では、実際に設定ファイルを読み込んで必要な情報を取り出すプログラムに挑戦してみます。
まずは前回のおさらいを兼ねて手順を確認しておきましょう。。ここではファイルを読み込んで、情報を取り出すところまでの処理について取り上げますが、その大まかな処理の流れは以下のようになります。
- ドキュメントビルダを生成する
- パースしてDOMのオブジェクトを取得する
- ノードをたどって必要な情報を取り出す
これらの処理について詳しく見ていくことにしましょう。
[1]ドキュメントビルダを生成する
まずドキュメントビルダを生成します。そのためにはまずドキュメントビルダファクトリを生成するところから始めます(リスト4)。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder();
[2]パースしてDOMのオブジェクトを取得する
ドキュメントビルダが生成できたら、XMLのファイル(設定ファイルですね)をパースし、DOMのオブジェクトを取得するだけです(リスト5)。
FileInputStream in = new FileInputStream( .... ); // 実際のパスを指定します Document root = builder.parse(in);
前回は、URIを指定してパースするparseメソッドを用いました。今回はローカルのファイルを処理するケースが多いだろうという前提から、InputStreamを引数にとるparseメソッドを利用しています。
[3] ノードをたどって必要な情報を取り出す
まずは接続情報を表すconnectionのノードを取り出してみます。前回見たように、ドキュメントビルダによって返されるノードはDocumentノードになっていますから、その子どもを取り出します(リスト6)。
Node connection = root.getFirstChild();
さて、ここからが本番です。connectionに含まれる子どものノードを取り出して、1つ1つ内容を確認していきます。
NodeList params = connection.getChildNodes(); String driver = null; String url = null; String user = null; String password = null; Properties props = new Properties(); for (int i = 0; i < params.getLength(); i++) { Node node = params.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { String tag = node.getNodeName(); if (tag.equals("driver")) { driver = node.getFirstChild().getNodeValue(); } else if (tag.equals("url")) { url = node.getFirstChild().getNodeValue(); } else if (tag.equals("user")) { user = node.getFirstChild().getNodeValue(); } else if (tag.equals("password")) { password = node.getFirstChild().getNodeValue(); } else if (tag.equals("property")) { NamedNodeMap attrs = node.getAttributes(); String name = attrs.getNamedItem("name").getNodeValue(); String value = attrs.getNamedItem("value").getNodeValue(); props.setProperty(name, value); } } }
getChildNodes()で子ノードの一覧を取る操作は前回も出てきました。各ノードをforで1つずつ取り出しているところも同じです。
ポイントは、子ノードがElement、つまりタグの場合に、そのタグ名を確認し、その値を変数にセットしているところです(driver、 url、 user、password)。
propertyの場合のみ、属性値を取り出してハッシュテーブル(実際にはPropertiesのインスタンス)にセットしていますので注意してください。
前回は、子ノードのリストに対してインデックスを指定し、直接子ノードを取り出す操作を行っていました。今回も同様の処理でよさそうなものですが、そうはなっていません。前回少し話に上がりましたが、空白や改行もテキストノードとして子ノードのリストに含まれます。空白や改行があるかどうかは、ファイルの書き方によるため、インデックスを直接指定するような書き方ではうまく動かないわけです。
Copyright © ITmedia, Inc. All Rights Reserved.