DOMでxmlファイルを読み込む例。
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); DocumentBuilder builder = factory.newDocumentBuilder(); InputStream is = new FileInputStream("xmlファイル"); Document doc; try { doc = builder.parse(is); } finally { is.close(); } Node node = doc.getLastChild(); //ルートタグ printNode(node, 0);
/** ノードの子要素を全て表示する */ public static void printNode(Node node, int tab) { for (int i = 0; i < tab; i++) { System.out.print(" "); } System.out.printf("[%d]%s: %s%n", node.getNodeType(), node.getNodeName(), node.getNodeValue()); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) { Node n = list.item(i); printNode(n, tab + 1); } }
xmlファイル内にDTD等の定義があれば、妥当性検証を実施することが出来る。
factory.setValidating(true); //検証を行う指定 〜 doc = builder.parse(is); //この中で検証が行われる
検証でエラーになると、デフォルトでは標準エラー(コンソール)にメッセージが出力される。
エラー時に自分で処理するハンドラーを指定することも出来る。
builder.setErrorHandler(new MyErrorHandler()); 〜 doc = builder.parse(is); //この中で検証が行われる
import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class MyErrorHandler implements ErrorHandler { @Override public void warning(SAXParseException e) throws SAXException { System.out.printf("【warn】%d %s%n", e.getLineNumber(), e); } @Override public void error(SAXParseException e) throws SAXException { System.out.printf("【error】%d %s%n", e.getLineNumber(), e); } @Override public void fatalError(SAXParseException e) throws SAXException { System.out.printf("【fatal】%d %s%n", e.getLineNumber(), e); } }
xmlファイル内にDOCTYPEがあってシステム識別子(dtdファイルの場所)が定義されているとき、検証前にそれを変更することが出来る。
builder.setEntityResolver(new MyEntityResolver()); 〜 doc = builder.parse(is); //この中で検証が行われる
mport java.io.IOException; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public class MyEntityResolver implements EntityResolver { @Override public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { // System.out.println("▼MyEntityResolver"); // System.out.println(publicId); // System.out.println(systemId); // System.out.println("▲MyEntityResolver"); if ("-//hishidama//DTD xml-dtd sample//EN".equals(publicId)) { InputSource source = new InputSource(); source.setPublicId(publicId); source.setSystemId("file:C:/dtd/sample.dtd"); return source; } return null; //nullを返すとデフォルト動作(systemIdが「http:」なら、インターネットにアクセスに行く) } }