Java XMLをDOMで読み込んで内容を取得する
JavaでXMLファイルの内容を読み込むにはjavax.xml.parsers.DocumentBuilderを使います。
サンプルを見ればわかりますが、DocumentBuilderでファイルを読み込んで、エレメント(要素)を引っ張り出してきます。
今回はこんなsample.xmlを読み込んでみます。
<?xml version="1.0"?> <persons name="my friend"> <person name="yoshida"> <age>28</age> <interest>basketball</interest> </person> <person name="yamada"> <age>26</age> <interest>baseball</interest> </person> </persons>
お友達リストのようなイメージです。
ここからテキスト情報(タグに囲まれてる"baseball"とか)や、属性情報(タグの中にあるname="yamada"とか)を取得してみます。
フォルダ構成はこんな感じ。
XMLを読み込むクラスはこちらになります。
XmlReader.java
package reader; 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.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class XmlReader { public void domRead(String file) throws SAXException, IOException, ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = factory.newDocumentBuilder(); Document document = documentBuilder.parse(file); Element root = document.getDocumentElement(); //ルート要素のノード名を取得する System.out.println("ノード名:" +root.getNodeName()); //ルート要素の属性を取得する System.out.println("ルート要素の属性:" + root.getAttribute("name")); //ルート要素の子ノードを取得する NodeList rootChildren = root.getChildNodes(); System.out.println("子要素の数:" + rootChildren.getLength()); System.out.println("------------------"); for(int i=0; i < rootChildren.getLength(); i++) { Node node = rootChildren.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element)node; if (element.getNodeName().equals("person")) { System.out.println("名前:" + element.getAttribute("name")); NodeList personChildren = node.getChildNodes(); for (int j=0; j < personChildren.getLength(); j++) { Node personNode = personChildren.item(j); if (personNode.getNodeType() == Node.ELEMENT_NODE) { if (personNode.getNodeName().equals("age")) { System.out.println("年齢:" + personNode.getTextContent()); } else if (personNode.getNodeName().equals("interest")) { System.out.println("趣味:" + personNode.getTextContent()); } } } System.out.println("------------------"); } } } } }
こいつをMainクラスで使ってみます。
package action; import reader.XmlReader; public class Main { public static void main(String[] args) throws Exception { XmlReader reader = new XmlReader(); reader.domRead("sample.xml"); } }
結果はこうなります。
ノード名:persons ルート要素の属性:my friend 子要素の数:5 ------------------ 名前:yoshida 年齢:28 趣味:basketball ------------------ 名前:yamada 年齢:26 趣味:baseball ------------------
今回参考にしたのはこの書籍です。
開発に必要なサンプルはだいたい載っています。
Java逆引きレシピ