JavaでXMLSchemaで検証する方法

XML Schemaを作ったのはいいけど、検証方法がどうやったら?
ってことで、ググって調べてみて、@ITの記事を元にちょっと書き換えて書いてみました。

http://www.atmarkit.co.jp/fjava/javatips/129java024.html


J2SE6なら、何のライブラリをインストールしなくても動きました。

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;

public class tt {
	public static void main(String[] args) {
		try {
			XMLReader objXml=SAXParserFactory.newInstance().newSAXParser().getXMLReader();
			// エラーハンドラ設定
			objXml.setErrorHandler(new ErrorHandler(){
				public void fatalError(SAXParseException e) {
					System.out.println("致命的なエラー: " + e.getLineNumber() +"行目");
					System.out.println(e.getMessage());
				}
				public void error(SAXParseException e) {
					System.out.println("エラー: " + e.getLineNumber() +"行目");
					System.out.println(e.getMessage());
				}
				public void warning(SAXParseException e) {
					System.out.println("警告: " + e.getLineNumber() + "行目");
					System.out.println(e.getMessage());
				}
			});

			// XMLSchemaによる検証処理を有効に
			objXml.setFeature("http://xml.org/sax/features/validation", true);
			objXml.setFeature("http://apache.org/xml/features/validation/schema",true);
			objXml.setFeature("http://xml.org/sax/features/namespaces",true);

			// 実行時引数で指定されたファイルについて解析を行う
			objXml.parse(args[0]);
			System.out.println("検証処理を終了しました。");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

以下は前に書いてた、XML Schemaxmlファイルです。
exp.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://xml.netbeans.org/schema/exp"
    xmlns:tns="http://xml.netbeans.org/schema/exp"
    elementFormDefault="qualified">

    <xsd:element name="exp">
        <xsd:complexType>
            <xsd:group ref="tns:exp"/>
        </xsd:complexType>
    </xsd:element>

    <xsd:group name="exp">
        <xsd:choice>
            <xsd:element name="number">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:short"/>
                </xsd:simpleType>
            </xsd:element>

            <xsd:element name="add">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:group ref="tns:exp"/>
                        <xsd:group ref="tns:exp"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="sub">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:group ref="tns:exp"/>
                        <xsd:group ref="tns:exp"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="mul">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:group ref="tns:exp"/>
                        <xsd:group ref="tns:exp"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="div">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:group ref="tns:exp"/>
                        <xsd:group ref="tns:exp"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:choice>
    </xsd:group>

</xsd:schema>

exp.xml

<?xml version="1.0" encoding="UTF-8"?>
<exp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://xml.netbeans.org/schema/exp"
   xsi:schemaLocation="http://xml.netbeans.org/schema/exp exp.xsd">
   <add>
       <div>
           <sub>
               <number>1</number>
               <number>2</number>
           </sub>
           <number>3</number>
       </div>
       <add>
           <number>4</number>
           <number>5</number>
       </add>
   </add>
</exp>