<更新記録>
2007年 11月 18日
作成

姉妹サイト検索 Web検索


XMLSchemaで妥当性検証

JAXPにて、XMLをパースする際、DTDではなく、XML-Schemaを適用する手順を簡単にまとめてみました。 自分の備忘記のところが大きいです。 XMLを最初から勉強したいという方は対象としていません。

説明

用意するものは以下の3つです。

  • Javaソースファイル
  • XMLファイル
  • XMLSchemaファイル

以下最も簡単なサンプルを紹介します。

Javaソース
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ファイル
<?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>
XMLSchemaファイル
<?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>

気をつける点は、

  • Javaソースの中のXMLファイルのパスは、Java実行ディレクトリからの相対パス
  • XMLファイルの中で指定しているXMLSchemaファイルのパスは、XMLファイルからの相対パス
  • DocumentBuilderFactory#setFeature(String,boolean)にセットする名前空間は、 DocumentBuilderFactoryの実装のベンダーに依存する。

です。 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"のようになります。


Powered by VeryEasyCMS