■
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でひとつひとつたどって行くって人もググるといますが、さすがにそれ乱暴過ぎるよなあ。後から見直したとき絶対わかんないだろうし。