XMLSchemaで妥当性検証で、一般的なXMLSchemaでの妥当性検証の方法をまとめましたが、 その方法だと、schemaLocationやnoNamespaceSchemaLocation等の記述をXMLファイルにすることで、 あらかじめXMLスキーマファイルを関連づけておかなければなりませんでした。 しかし、XMLファイルとXMLスキーマファイルの関連を、完全に分離したい場合もあります。 そこで使うJAXPが、javax.xml.validation.Validatorクラスです。
用意するものは以下の3つです。
以下最も簡単なサンプルを紹介します。
public class Validation {
public static void main(String[] args) throws SAXException, IOException {
DocumentBuilderFactory factory;
DocumentBuilder builder;
SchemaFactory sFac;
Schema schema;
factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setSchema(schema);
builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("./sample.xml"));
// 妥当性検証
sFac = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schema = sFac.newSchema(new File("./sample.xsd"));
Validator validator = schema.newValidator();
validator.validate(new DOMSource(doc));
}
}
<?xml version="1.0" encoding="UTF-8"?>
<root>
<number1>aiu</number1>
<number2>eo</number2>
</root>
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="root"> <xsd:complexType> <xsd:sequence> <xsd:element name="number1" type="xsd:string"/> <xsd:element name="number2" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
しかしXMLReader(及びSAXParser)でこの検証方法を使用すると、 ストリームから2回読み込まなくてはならなくなります。(検証時とパース時) その問題を解決する方法を、 XMLSchemaで妥当性検証(javax.xml.validation.ValidatorHandler) で紹介します。