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)
・
・
・
|