JAXPにて、XMLをパースする際、DTDではなく、XML-Schemaを適用する手順を簡単にまとめてみました。 自分の備忘記のところが大きいです。 XMLを最初から勉強したいという方は対象としていません。
用意するものは以下の3つです。
以下最も簡単なサンプルを紹介します。
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
public class TestXMLSchema {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory;
DocumentBuilder builder;
factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true);
factory.setAttribute("http://apache.org/xml/features/validation/schema", true);
builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("./xmlExample.xml"));
}
}
<?xml version="1.0" encoding="UTF-8"?>
<root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schemaExample.xsd">
<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>
気をつける点は、
です。 Java6の実装では、デフォルトでは com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl が使われるようになっています。
JAXPのDocumentBuilderFactory#setSchemaは使わなくても、XMLファイル内でnoNamespaceSchemaLocationを指定すれば、 認識してくれるみたいです。 ある名前空間について記述されたXMLSchemaの場合は、noNamespaceSchemaLocationでなく、schcemaLocationで指定します。 その場合、schemaLocation="http://ggaogg.jp/XWWD/data ./xwwdData.xsd"のようになります。