マイナー・マイナー

隠れた名作の発掘が生きがい。

JavaでXML文書を読みこみ要素情報を取得する


スポンサードリンク

XML文章を読み込み,その文章に書かれた要素情報を取得するJavaプログラムを作ってみました.前回のJavaでXML文書を記述しファイルへ書きこむで書いたプログラムを実行して得られたXML文章の要素や属性等の情報を抽出します.


ソースコード

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

public class ReadXML {

     public static void main(String[] args) {

          // XMLファイルの読み込み
          File file = new File("Human.xml");
          Document document = read(file);

          // 要素情報の取得
          System.out.println(document.getNodeName());
          if (document.hasChildNodes()) {
               Node human = document.getFirstChild();
               System.out.println(human.getNodeName());

               if (human.hasChildNodes()) {
                    Node japanease = human.getFirstChild();
                    System.out.println(japanease.getNodeName());
                    // 属性値の取得
                    NamedNodeMap namedNodeMap = japanease.getAttributes();

                    System.out.println(namedNodeMap.getNamedItem("sex")
                              .getNodeValue());

                    if (japanease.hasChildNodes()) {
                         Node text = japanease.getFirstChild();

                         System.out.println(text.getNodeName());

                         System.out.println(text.getNodeValue());
                    }
               }
          }
     }

     public static Document read(File file) {

          // DocumentBuilderインスタンスの生成
          DocumentBuilder documentBuilder = null;
          try {
               documentBuilder = DocumentBuilderFactory.newInstance()
                         .newDocumentBuilder();
          } catch (ParserConfigurationException e) {
               e.printStackTrace();
               return null;
          }

          // XMLファイルの読み込み
          Document document = null;
          try {
               document = documentBuilder.parse(file);
          } catch (SAXException e) {
               e.printStackTrace();
          } catch (IOException e) {
               e.printStackTrace();
          }

          return document;
     }
}


読み込む文章(Human.xml

<?xml version="1.0" encoding="Shift_JIS"?><human><japanese sex="male">Taro</japanese></human>

前回のプログラムのアウトプットとして得られるXML文章には改行が入っていました.しかし,なぜかその文章だと読み込み途中でエラーが出てうまく読み込めませんでした.改行なしのXML文章に直して読み込みプログラムを実行するとなぜかうまく読み込めたので,今はこれでいいかということにしています.


実行結果


#document
human
japanese
male
#text
Taro


メイン処理は大きく2つです.
1.XMLファイルの読み込み
指定したXMLファイルの内容をDocumentオブジェクトとして取得する処理です.どうやらDocumentBuilderのparseを使うだけで取得できるようです.コードはJavaでDOMを参照して書きました.


2.要素,属性等の取得
次のようなメソッドを使って要素や属性を取得します.
getNodeName 要素名を取得
hasChildNode 子要素を持っているか確認
getFirstChild 最初に見つかった子要素を取得
getNodeValue 要素内容を取得


属性値の取得はややこしい.
getAttributes 属性の集合を取得
getNamedItem 属性名から属性の情報を取得
getNodeValue 上記2つの手順を踏めば属性値を取得


本当はノードというデータ型を用いて解説すべきなのだけれど,まだノードがよく分かっていないためと,XML文章を取り出すということに特化したかったためにきちんとした解説にはならずじまいでした.実行結果に#documentと#textが出てくるのはノードのためです.


うーん,なんか穴がいっぱいありそうな・・・