XMLSchemaを使ったXMLファイルの妥当性検証を行うJavaTips 〜Javaアプリケーション編

» 2005年02月23日 10時00分 公開
[山田祥寛@IT]

 「DTDを使ったXMLファイルの妥当性検証を行う」では、DTD(Document Type Definition)を利用したXML文書の妥当性を検証する方法について紹介しました。「DTDを使ったXMLファイルの妥当性検証を行う」でも紹介したように、DTDを利用することでデータ検証をXMLパーサに委ねることができるという利点があります。しかし、DTDにまったく問題がないというわけではありません。例えば、DTDには「XML文書とは異なる形式で記述しなければならない」「データ型を持たない」「名前空間をサポートしない」など、XMLを高度に利用する場合にネックとなるさまざまな短所もあります。

 このような問題を解消するために策定されたのがXML Schemaです。XML Schemaは仕様自体が複雑多岐にわたるため、仕様勧告当初はしばらく敬遠されていたきらいもありましたが、昨今、サーブレット2.4ではデプロイメント・ディスクリプタ(web.xml)の文書型宣言に利用されるなど、少しずつXML Schemaが利用される機会も多くなってきています。XML Schemaに関する詳細は本TIPSの守備範囲を超えるため、ここでは割愛しますが、「XMLテクニック集」なども参考にしていただければと思います。本TIPSでは、XML Schemaを利用して「DTDを使ったXMLファイルの妥当性検証を行う」同様の処理を実現してみることにしましょう。

(1)XML文書とXML Schema文書とを用意する

 ここでは、最も単純なXML Schema文書の例として、以下のようなbook.xsdとbook.xsdに基づいて記述したXML文書book.xmlを定義しておくことにします。XML Schemaに関する細かな構文規則については説明しませんが、一点だけ以下の点を理解しておいてください。

book.xml
<?xml version="1.0" encoding="UTF-8"?>
<book xmlns="http://www.wings.msn.to/schema/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.wings.msn.to/schema/ book.xsd">
10日でおぼえるXML入門教室
</book>


book.xsd
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="unqualified" elementFormDefault="qualified"
targetNamespace="http://www.wings.msn.to/schema/">
<xsd:element name="book" type="xsd:string" />
</xsd:schema>


 赤字部分がXML文書を特定のXML Schemaに結び付けている部分です。ここでは、“http://www.wings.msn.to/schema/”名前空間に属する<book>要素配下の一連の文書が「book.xsd」で指定されたXML Schemaのルールにのっとっているということを意味します。

(2)Javaアプリケーションを用意する

 XML/XMLSchema文書の用意ができたところで、次にパーサによる解析を実行するためのJavaアプリケーションを作成してみましょう。

SchemaValidation.java
package to.msn.wings.javatips;

import javax.xml.parsers.SAXParserFactory;

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

public class SchemaValidation {
  public static void main(String[] args) {
    try {
      SAXParserFactory objFac=SAXParserFactory.newInstance();
      XMLReader objXml=objFac.newSAXParser().getXMLReader();
       // エラー処理用のハンドラクラスを設定する
      objXml.setErrorHandler(new SchemaErr());
       // 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();
    }
  }
}
 // エラー発生時の処理を定義するハンドラクラス
class SchemaErr implements 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());
  }
}


 本サンプルを実行するには、以下のサイトからあらかじめXercesをダウンロードし、Xerces-J-bin.X.X.X.zip(X.X.Xはバージョン番号)に含まれるxercesImpl.jarに対してクラスパスを設定する必要があります。

http://xml.apache.org/xerces2-j/index.html


 以上をコンパイルの後、コマンドプロンプトから以下のように入力してください。なお、検証対象となるbook.xmlとスキーマ文書book.xsdは、あらかじめCドライブの直下に配置しておくものとします。

> java to.msn.wings.javatips.SchemaValidation c:\book.xml


 もしもXML文書中に不備があった場合には、コマンドプロンプト上にメッセージが表示されるはずです。例えば、以下は<book>要素の配下に誤った要素が存在する場合のエラー例です。

エラー: 6行目
cvc-type.3.1.2: Element 'book' is a simple type, so it must have no element information item [children].
検証処理を終了しました。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。