S-JIS[2008-11-01] 変更履歴

Java XML DOM

JavaXMLを操作するDOMについて。


DOMを使った読み込み

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:」なら、インターネットにアクセスに行く)
	}
}

XMLへ戻る / Java目次へ戻る
メールの送信先:ひしだま