Javaでxmlファイルを読み込むには、XMLパーサーを使う。
XMLパーサーにはDOM用とSAX用のAPIがあり、読み込み方(処理のされ方)が異なる。
→DOMについてはこちらに移転しました。[2017-05-21]
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:」なら、インターネットにアクセスに行く)
}
}