Subscribed unsubscribe Subscribe Subscribe

java + DOMでxmlを扱うときのベストな方法ってあるのかなあ、とときどき悩みます。
だってめんどくさいんだもん。

<?xml version="1.0" encoding="UTF-8" ?>
<venture>
  <company>
    <name>ソフトバンク株式会社</name>
    <url>http://www.softbank.co.jp/</url>
  </company>

  <company>
    <name>楽天株式会社</name>
    <url>http://www.rakuten.co.jp/info/</url>
  </company>
</venture>

XML文書のサンプル - XMLの基本 - XML入門
ちょっと借りた。


上のxmlの肝っぽいとこを抜き出すJavaプログラム
出力結果

venture
	company
		name: ソフトバンク株式会社
		url: http://www.softbank.co.jp/
	company
		name: 楽天株式会社
		url: http://www.rakuten.co.jp/info/
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.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XMLParser {

	public static void main(String[] args) {

		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();


			File xmlFile = new File("/home/toshi/workspace/XML/src/sample.xml"); 
			Document doc = builder.parse(xmlFile);

			Element root = doc.getDocumentElement();
			System.out.println(root.getNodeName());

			NodeList companyNodeList = root.getElementsByTagName("company");

			for(int i = 0; i < companyNodeList.getLength(); i++){
				Element company = (Element) companyNodeList.item(i);
				NodeList nameNodeList = company.getElementsByTagName("name");
				NodeList urlNodeList = company.getElementsByTagName("url");

				System.out.println("\t" + company.getNodeName());
				
				for (int j = 0; j < nameNodeList.getLength(); j++) {
					Node nameNode = nameNodeList.item(j); 
					String name = nameNode.getTextContent();
					System.out.println("\t\tname: " + name);
				}
				for (int j = 0; j < urlNodeList.getLength(); j++) {
					Node urlNode = urlNodeList.item(j); 
					String url = urlNode.getTextContent();
					System.out.println("\t\turl: " + url);
				}	
			}

		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

getElementsByTagNameとかgetChildNodesとかでNodeListを取得して、そこからお目当てのノードを見つけて取り出す、ってのが一番ミスが少ないんじゃないかと思うのですが、どうなんでしょうか?
まず改行を全部とりのぞき、getFirstChildとかgetNextSiblingでひとつひとつたどって行くって人もググるといますが、さすがにそれ乱暴過ぎるよなあ。後から見直したとき絶対わかんないだろうし。