Java プログラムメモ


トップ

SAX で DTD の妥当性検証を行う

SAX で XML を解析する場合に、『SAX で XML 解析』で紹介した方法では、 DOCTYPE 宣言があっても、 DTD の妥当性検証を行いません。そこで、 DTD の妥当性検証を行う方法を紹介します。

SAX で DTD の妥当性検証をさせる為には、XMLReader の setFeature() メソッドで
setFeature("http://xml.org/sax/features/validation", true);
を設定します。

また、妥当性検証中に異常が発生した場合は ErrorHandler が呼ばれるので、ErrorHandler を 実装したクラスを作成して、XMLReader の setErrorHandler メソッドで
setErrorHandler(new ErrorTestHandler());
のように設定します。

以下に、XML を解析する例を書きます。パーサーには xerces-2.6.2 を利用しています。

XML 例

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE document SYSTEM "file:///C:/work/test.dtd"> <document> <element attribute="attribute">Test</element> </document>

DTD 例

<?xml version="1.0" encoding="UTF-8" ?> <!ELEMENT document (data)> <!ELEMENT data (#PCDATA)> <!ATTLIST data attribute CDATA #REQUIRED>

Java 記述例

public class SAXTest { public static void main(String[] args) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader xmlReader = parser.getXMLReader(); xmlReader .setFeature("http://xml.org/sax/features/validation", true); xmlReader.setErrorHandler(new ErrorTestHandler()); xmlReader.setContentHandler(new SAXTestHandler()); xmlReader.parse(new InputSource(new FileInputStream( "C:/work/test.xml"))); } catch (Exception e) { e.printStackTrace(); } } // SAX のハンドラクラス private static class SAXTestHandler extends DefaultHandler { // Document の開始通知を受け取る public void startDocument() { System.out.println("start....."); } // 要素の開始通知を受け取る public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("start element: " + qName); if (qName.equals("element")) { System.out.println("att: " + attributes.getValue("attribute")); } } // 要素を受け取る public void characters(char[] ch, int offset, int length) { if (offset != 0) { System.out .println("element :" + new String(ch, offset, length)); } } // 要素の終了通知を受け取る public void endElement(String uri, String localName, String qName) { System.out.println("end element: " + qName); } // Document の終了通知を受け取る public void endDocument() { System.out.println("end......"); } // default constructor SAXTestHandler() { } } // DTD の検証で異常が発生した場合の処理 private static class ErrorTestHandler implements ErrorHandler { public void warning(SAXParseException e) throws SAXException { throw new SAXException(e); } public void error(SAXParseException e) throws SAXException { throw new SAXException(e); } public void fatalError(SAXParseException e) throws SAXException { throw new SAXException(e); } // default constructor ErrorTestHandler() { } } }

出力結果

start..... start element: document org.xml.sax.SAXParseException: Element type "element" must be declared. at SAXTest$1.error(SAXTest.java:35) at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source) ・ ・ ・


SEO [PR] おまとめローン Windows7 冷え性対策 動画 掲示板 レンタルサーバー ライブチャット SEO