import java.io.File;
import java.io.IOException;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.ValidatorHandler;
import javax.xml.XMLConstants;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;

public class SAXValidation {
	public static void main(String[] args) throws SAXException, IOException {
		XMLReader reader;
		ValidatorHandler hValidator;
		SchemaFactory sFac;
		Schema schema;
		MyContentHandler myContentHandler;
		
		sFac = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
		schema = sFac.newSchema(new File("./sample.xsd"));
		
		hValidator = schema.newValidatorHandler();
		myContentHandler = new MyContentHandler();
		hValidator.setContentHandler(myContentHandler);
		
		reader = XMLReaderFactory.createXMLReader();
		reader.setContentHandler(hValidator);
		try {
		  reader.parse("./sample.xml");
		} 
		catch (SAXParseException e) {
		  System.out.println(e.getMessage());
		}
		System.out.println("number1 要素の中身 = " + myContentHandler.number1);
		System.out.println("number2 要素の中身 = " + myContentHandler.number2);
	}
	
	// number1要素の中身とnumber2要素の中身を読み取るハンドラ
	private static class MyContentHandler extends DefaultHandler {
		private static final String EN_NUMBER1 = "number1";
		private static final String EN_NUMBER2 = "number2";
		
		private StringBuffer sb;
		
		public String number1;
		public String number2;
		
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) {
			if (EN_NUMBER1.equals(localName) || EN_NUMBER2.equals(localName)) {
				sb = new StringBuffer();
			}
		}
		
		public void characters(char[] ch, int start, int length) {
			if (sb != null) {
				sb.append(ch, start, length);
			}
		}
		
		public void endElement(String uri, String localName, String qName) {
			if (EN_NUMBER1.equals(localName)) {
				number1 = sb.toString();
				sb = null;
			} else if (EN_NUMBER2.equals(localName)) {
				number2 = sb.toString();
				sb = null;
			}
		}
	}
}
