XML 妥当性検証のための Java API

文書がスキーマに準拠しているかどうかをチェックする

妥当性検証を行うと、スキーマで指定されるルールに文書が準拠しているかどうかを調べることができます。DTD、W3C XML Schema Language、RELAX NG、Schematron など、どのようなスキーマ言語がサポートされるかは、パーサーやツールによって異なります。Java 5™ には汎用の妥当性検証 API (Application Programming Interface) が追加されており、この API を使用することで、これらの言語や他の言語で作成されたスキーマに対して文書を比較することができます。この、XML を妥当性検証するための API について、この記事を読んで学びましょう。

Elliotte Rusty Harold, Adjunct Professor, Polytechnic University

Photo of Elliot Rusty HaroldElliotte Rusty Harold はニューオーリンズ出身であり、時たま、おいしい gumbo (オクラ入りのスープ) を食べに帰っています。ただし現在はニューヨークのブルックリン近郊の Prospect Heights に、妻の Beth と猫の Charm (charmed quarkからとりました) と Marjorie (義理の母の名前からとりました) と一緒に住んでいます。彼は Polytechnic University のコンピューター・サイエンスの非常勤教授として、Java 技術とオブジェクト指向プログラミングを教えています。彼の Cafe au Lait Web サイトは、インターネット上で最も人気のある独立系 Java サイトの一つです。また、そこから派生した Cafe con Leche は、最も人気のある XML サイトの一つです。彼の最近の著作には『Java I/O, 2nd edition』があります。現在は XML 処理用の XOM API や Jaxen XPath エンジン、Jester テスト・カバレッジ・ツールなどに取り組んでいます。



2010年 2月 10日 (初版 2006年 8月 08日)

2010年 2月 10日 - 読者から寄せられたコメントを基に、「妥当性検証」セクション内の「文書の中で指定されているスキーマに対して妥当性検証を行う」サブセクション直前の段落の内容が、著者によって「スレッドセーフなのはスキーマのみであり、バリデーターとスキーマ・ファクトリーはスレッドセーフではありません。」と更新されました。

妥当性検証は、要求する形式に検証対象がおおよそ従っているかどうかを素早くチェックできる強力な手段です。妥当性検証を行うことで、文書がプロセスによって処理可能な内容とはかけ離れていることを素早く判断し、その文書を拒否することができます。データに問題がある場合には、後になってその問題が見つかるよりも、早い段階で見つけられるに越したことはありません。

XML (Extensible Markup Language) の場合、妥当性検証を行うためには、通常は文書の内容についての詳細仕様を何らかのスキーマ言語によって作成する必要があります。スキーマ言語はいくつかあり、例えば W3C (World Wide Web Consortium) の XSD (XML Schema Language)、RELAX NG、DTD (Document Type Definition)、Schematron などがあります。妥当性検証は構文解析中に行われることも、構文解析の直後に行われることもありますが、いずれの場合も通常は、どのような入力処理よりも前に行われます (このように断言してしまうのはいささか乱暴であり、実際にはいくつかの例外があります)。

最近まで、プログラムで妥当性検証を行う場合の具体的な API (Application Programming Interface) は、スキーマ言語やパーサーごとに異なっていました。通常、DTD や XSD には SAX (Simple API for XML) や DOM (Document Object Model)、JAXP (Java™ API for XML Processing) などの構成オプションとしてアクセスしていました。RELAX NG を使用する場合にはカスタムのライブラリーと API が必要でした。Schematron の場合には TrAX (Transformations API for XML) を使用し、また別のスキーマ言語の場合には、さらに別の API を学ぶ必要がありました。しかしこれらの API は基本的に同じことを行っていたのです。

Java 5 には、スキーマ言語に依存せずに妥当性検証サービスを提供するインターフェースとして、javax.xml.validation パッケージが導入されています。JAXP 1.3 を別にインストールする場合には、このパッケージを Java 1.3 およびそれ以降にも利用することができます。他の製品では、このライブラリーの実装が Xerces 2.8 に含まれています。

妥当性検証

javax.xml.validation API は、文書の妥当性検証を行うために SchemaFactorySchemaValidator という 3 つのクラスを使用し、XML 文書を表現するために TrAX の javax.xml.transform.Source インターフェースを大いに利用します。簡単に言えば、SchemaFactory を使ってスキーマ文書 (多くの場合は XML ファイル) を読み取り、その文書から Schema オブジェクトを作成します。Schema オブジェクトは Validator オブジェクトを作成します。そして最後に、Source オブジェクトとして表現された XML 文書を Validator オブジェクトによって妥当性検証します。

リスト 1 はコマンドラインに入力された URL を DocBook の XSD スキーマに対して妥当性検証する簡単なプログラムです。

リスト 1. XHTML (Extensible Hypertext Markup Language) 文書の妥当性検証をする
import java.io.*;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import org.xml.sax.SAXException;

public class DocbookXSDCheck {

    public static void main(String[] args) throws SAXException, IOException {

        // 1. Lookup a factory for the W3C XML Schema language
        SchemaFactory factory = 
            SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        
        // 2. Compile the schema. 
        // Here the schema is loaded from a java.io.File, but you could use 
        // a java.net.URL or a javax.xml.transform.Source instead.
        File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
        Schema schema = factory.newSchema(schemaLocation);
    
        // 3. Get a validator from the schema.
        Validator validator = schema.newValidator();
        
        // 4. Parse the document you want to check.
        Source source = new StreamSource(args[0]);
        
        // 5. Check the document
        try {
            validator.validate(source);
            System.out.println(args[0] + " is valid.");
        }
        catch (SAXException ex) {
            System.out.println(args[0] + " is not valid because ");
            System.out.println(ex.getMessage());
        }  
        
    }

}

下記は JDK (Java 2 Software Development Kit) 5.0 にバンドルされている Xerces を使って妥当でない文書をチェックしたときの典型的な出力です。

file:///Users/elharo/CS905/Course_Notes.xml is not valid because cvc-complex-type.2.3: Element 'legalnotice' cannot have character [children], because the type's content type is element-only.

妥当性検証で使用するスキーマや、妥当性検証の対象となる文書、さらにはスキーマ言語も、容易に変更することができます。しかしどの場合にも、妥当性検証は以下の 5 つのステップに従います。

  1. スキーマの作成に使用されている言語のスキーマ・ファクトリーをロードします。
  2. ソースからスキーマをコンパイルします。
  3. コンパイルされたスキーマからバリデーターを作成します。
  4. 検証対象の文書の Source オブジェクトを作成します。通常は StreamSource が最も単純な Source オブジェクトです。
  5. 入力ソースの妥当性検証を行います。その文書が妥当でない場合には、validate() メソッドによって SAXException がスローされます。それ以外の場合には、validate() メソッドは特別な処理を行うことなくリターンします。

妥当性検証では、同じバリデーターと同じスキーマを何度も続けて使用することができますが、スレッドセーフなのはスキーマのみであり、バリデーターとスキーマ・ファクトリーはスレッドセーフではありません。そのため、複数のスレッドの妥当性検証を同時に行う場合には、必ずそれぞれのスレッドに独自の Validator オブジェクトと SchemaFactory オブジェクトがあるようにします。

文書の中で指定されているスキーマに対して妥当性検証を行う

文書によっては、その文書の妥当性を検証する際のスキーマを指定しているものもあります。この指定は通常、xsi:noNamespaceSchemaLocation 属性や xsi:schemaLocation 属性を使って以下のように行われます。

<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="http://www.example.com/document.xsd">
  ...

スキーマを作成したものの、URL やファイル、ソースなどが指定されていない場合、Java 言語では、妥当性検証で使用すべきスキーマを見つけるために検証対象の文書を調べるプログラムが作成されます。下記はその一例です。

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();

ただし通常、このようにはしません。普通はスキーマを指定するのは文書を利用する側であり、文書を作成する側ではないからです。また、この手法は XSD の場合にしか有効ではありません。XSD 以外のすべてのスキーマ言語では、スキーマの場所を明示的に指定する必要があります。


抽象ファクトリー

SchemaFactory は抽象ファクトリーです。抽象ファクトリーによるデザイン・パターンを利用していることによって、この API 1 つで多くの異なるスキーマ言語やオブジェクト・モデルをサポートすることができます。通常、1 つの実装でサポートできるのは、数ある言語やモードの一部にすぎません。しかし、この API を使って (例えば) RELAX NG スキーマに対して DOM 文書の妥当性を検証する方法を習得すると、この同じ API を使用して、W3C スキーマに対して JDOM 文書の妥当性を検証することができるのです。

例えば、リスト 2 は DocBook の RELAX NG スキーマに対して DocBook 文書の妥当性を検証するプログラムです。このプログラムはリスト 1 とほとんど同じです。リスト 1 から変わった点は、スキーマの場所と、スキーマ言語を指定する URL のみです。

リスト 2. RELAX NG を使って DocBook 文書を検証する
import java.io.*;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import org.xml.sax.SAXException;

public class DocbookRELAXNGCheck {

    public static void main(String[] args) throws SAXException, IOException {

        // 1. Specify you want a factory for RELAX NG
        SchemaFactory factory 
         = SchemaFactory.newInstance("http://relaxng.org/ns/structure/1.0");
        
        // 2. Load the specific schema you want. 
        // Here I load it from a java.io.File, but we could also use a 
        // java.net.URL or a javax.xml.transform.Source
        File schemaLocation = new File("/opt/xml/docbook/rng/docbook.rng");
        
        // 3. Compile the schema.
        Schema schema = factory.newSchema(schemaLocation);
    
        // 4. Get a validator from the schema.
        Validator validator = schema.newValidator();
        
        // 5. Parse the document you want to check.
        String input 
         = "file:///Users/elharo/Projects/workspace/CS905/build/Java_Course_Notes.xml";
        
        // 6. Check the document
        try {
            validator.validate(source);
            System.out.println(input + " is valid.");
        }
        catch (SAXException ex) {
            System.out.println(input + " is not valid because ");
            System.out.println(ex.getMessage());
        }  
        
    }

}

このプログラムをおなじみの Sun JDK を使って実行し、他のライブラリーを使わなかったとすると、おそらく以下のような内容が出力されます。

Exception in thread "main" java.lang.IllegalArgumentException: 
http://relaxng.org/ns/structure/1.0
	at javax.xml.validation.SchemaFactory.newInstance(SchemaFactory.java:186)
	at DocbookRELAXNGCheck.main(DocbookRELAXNGCheck.java:14)

このような出力となる理由は、Sun JDK にはデフォルトで RELAX NG バリデーターが含まれていないためです。スキーマ言語を認識できない場合には、SchemaFactory.newInstance() によって IllegalArgumentException がスローされます。ただし、Jing や JAXP 1.3 アダプターといった RELAX NG ライブラリーをインストールすると、W3C のスキーマによって得られる出力と同じ出力が得られるはずです。

スキーマ言語を指定する

javax.xml.constants クラスによって以下のような定数を定義すると、スキーマ言語を指定することができます。

  • XMLConstants.W3C_XML_SCHEMA_NS_URI: http://www.w3.org/2001/XMLSchema
  • XMLConstants.RELAXNG_NS_URI: http://relaxng.org/ns/structure/1.0
  • XMLConstants.XML_DTD_NS_URI: http://www.w3.org/TR/REC-xml

このリストはこれで終わりではありません。実装によって他の URL を自由にリストに追加し、他のスキーマ言語を指定することができます。通常、この URL は、そのスキーマ言語の名前空間の URI (Uniform Resource Identifier) です。例えば、http://www.ascc.net/xml/schematron という URL によって Schematron スキーマを指定することができます。

Sun の JDK 5 がサポートしているのは XSD スキーマのみです。DTD による妥当性検証はサポートされていますが、その検証機能を javax.xml.validation API から利用することはできません。DTD の場合には、通常の SAX の XMLReader クラスを使う必要があります。ただし、追加でライブラリーをインストールし、DTD や他のスキーマ言語のサポートを追加することもできます。

スキーマ・ファクトリーの検索方法

Java プログラミング言語では 1 つのスキーマ・ファクトリーしか使えないわけではありません。ある特定のスキーマ言語を指定する URI を SchemaFactory.newInstance() に渡すと、SchemaFactory.newInstance() は以下の場所をこの順序で検索し、渡された URI と一致するスキーマ・ファクトリーを見つけます。

  1. javax.xml.validation.SchemaFactory:[スキーマの URL]」というシステム・プロパティーに指定されているクラス
  2. $java.home/lib/jaxp.properties ファイルの中にある「javax.xml.validation.SchemaFactory:[スキーマの URL]」というプロパティーによって指定されているクラス
  3. 利用可能な任意の JAR (Java Archive) ファイルの META-INF/services ディレクトリーの中にある、javax.xml.validation.SchemaFactory サービス・プロバイダー
  4. そのプラットフォームでデフォルトの SchemaFactory (JDK 5 の場合には com.sun.org.apache.xerces.internal.jaxp.validation.xs.SchemaFactoryImpl)

独自のカスタム・スキーマ言語とそれに対応するバリデーターのサポートを追加するには、SchemaFactorySchema、そして Validator のサブクラスを作成し、そのスキーマ言語の処理方法を指定します。そして JAR ファイルを作成して上記の 4 つの場所のいずれか 1 ヶ所にインストールすればよいのです。こうした方法は、スキーマに制約を追加する際に W3C の XML Schema 言語のような宣言型言語を使用するよりも Java 言語のようなチューリング完全言語を使用して制約のチェックを行った方が容易な場合に役立ちます。


エラー・ハンドラー

スキーマのデフォルトのレスポンスでは、問題がある場合には SAXException をスローし、問題がない場合には何もしません。ただし SAX の ErrorHandler を使用すれば、その文書の問題に関する詳細な情報を得ることができます。例えば、すべての検証エラーをログに記録したいものの、検証エラーが発生しても処理を停止したくない、とします。そのような場合にはリスト 3 のようなエラー・ハンドラーをインストールします。

リスト 3. 致命的ではない妥当性検証エラーのみをログに記録するエラー・ハンドラー
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class ForgivingErrorHandler implements ErrorHandler {

    public void warning(SAXParseException ex) {
        System.err.println(ex.getMessage());
    }

    public void error(SAXParseException ex) {
        System.err.println(ex.getMessage());
    }

    public void fatalError(SAXParseException ex) throws SAXException {
        throw ex;
    }

}

このエラー・ハンドラーをインストールするには、このエラー・ハンドラーのインスタンスを作成し、そのインスタンスを ValidatorsetErrorHandler() メソッドに渡します。

  ErrorHandler lenient = new ForgivingErrorHandler();
  validator.setErrorHandler(lenient);

スキーマによる情報の追加

スキーマによっては、単なる妥当性検証以上のことをするものもあります。そのようなスキーマは、ある文書が妥当であるかどうかの問い合わせに対して真または偽で答えるだけではなく、その文書に情報を追加したりもします。例えば、デフォルトの属性値を提供したり、int や gYear といった型を要素や属性に対して指定したりすることもできます。バリデーターは、そのように型を指定された文書を作成し、それらの文書を javax.xml.transform.Result オブジェクトに書き込みます。そのために必要なことは、妥当性検証を行うための 2 番目の引数として Result を渡すことだけです。例えばリスト 4 では、入力文書の妥当性検証を行うとともに、入力文書とスキーマとの組み合わせから作成された DOM ツリーに対して情報を追加する形で文書を作成しています。

リスト 4. スキーマによって文書に情報を追加する
import java.io.*;
import javax.xml.transform.dom.*;
import javax.xml.validation.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;

public class DocbookXSDAugmenter {

    public static void main(String[] args) 
      throws SAXException, IOException, ParserConfigurationException {

        SchemaFactory factory 
         = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
        Schema schema = factory.newSchema(schemaLocation);
        Validator validator = schema.newValidator();
        
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true); // never forget this
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse(new File(args[0]));
        
        DOMSource source = new DOMSource(doc);
        DOMResult result = new DOMResult();
        
        try {
            validator.validate(source, result);
            Document augmented = (Document) result.getNode();
            // do whatever you need to do with the augmented document...
        }
        catch (SAXException ex) {
            System.out.println(args[0] + " is not valid because ");
            System.out.println(ex.getMessage());
        }  
        
    }

}

この処理は任意のソースを任意の結果に変換できるわけではなく、またストリームによるソースや結果にはまったく使えません。SAX で扱える形式のソースに情報を追加して SAX で扱える形式の結果を得ることや、DOM で扱える形式のソースに情報を追加して DOM で扱える形式の結果を得ることはできますが、SAX で扱える形式のソースに情報を追加して DOM で扱える形式の結果を得たり、DOM で扱える形式のソースに情報を追加して SAX で扱える形式の結果を得たりすることはできません。そのようにしたい場合には、一旦、ソースの形式に合わせて情報を追加し、同じ形式で結果が得られるようにした上で (つまり SAX で扱えるソースから SAX で扱える結果を、DOM で扱えるソースから DOM で扱える結果を得られるようにした上で)、後から TrAX による ID 変換を使ってモデルを変更します。

ただし、この手法は推奨できません。文書に必要な情報は、その文書のインスタンスの中にすべて含めた方が、インスタンスとスキーマの間で情報を分割するよりも、はるかに信頼性は高いのです。皆さんは妥当性検証を行うかもしれませんが、すべての人が行うとは限らないからです。


型情報

W3C XML Schema Language は型の概念を非常に重視しています。要素や属性は、int 型、double 型、date 型、duration 型、person 型、PhoneNumber 型等々、ありとあらゆる型として宣言されます。Java Validation API には、そうした型をレポートするための手段がありますが、その手段はこの API パッケージの他の部分からは驚くほど独立した作りになっています。

型は org.w3c.dom.TypeInfo オブジェクトによって識別されます。この単純なインターフェース (リスト 5 に要約してあります) によって、ある型のローカル名と名前空間 URI についての情報を得ることや、その型が他の型から派生したのかどうか、また他の型からどのように派生したのかも知ることができます。プログラム次第では、さらに詳しく型についての情報を得ることができます。その一方で、Java 言語によって型の意味を判断したり、データを Java の型 (doublejava.util.Date) に変換したりすることはできません。

リスト 5. DOM の TypeInfo インターフェース
package org.w3c.dom;

public interface TypeInfo {

  public static final int DERIVATION_RESTRICTION;
  public static final int DERIVATION_EXTENSION;
  public static final int DERIVATION_UNION;

  public String  getTypeName();
  public String  getTypeNamespace()
  public boolean isDerivedFrom(String namespace, String name, int derivationMethod);

}

TypeInfo オブジェクトを取得するためには、Validator ではなく ValidatorHandler に対して Schema オブジェクトを要求します。ValidatorHandler は SAX の ContentHandler インターフェースを実装しています。そこで、このハンドラーを SAX パーサーにインストールします。

また、皆さん独自の ContentHandler も (パーサーにではなく) ValidatorHandler にインストールする必要があります。ValidatorHandler は追加されたイベントを ContentHandler に転送します。

ValidatorHandler によって TypeInfoProvider が利用できるようになります。ContentHandler は随時 TypeInfoProvider を呼び出し、現在の要素の型や、その要素の属性のいずれか 1 つの型を判断することができます。また TypeInfoProvider によって、ある属性が ID なのかどうか、その属性が文書の中で明示的に指定されたのか、あるいはスキーマによってデフォルトで決まっているのかどうかも判断することができます。リスト 6TypeInfoProvider クラスを要約したものです。

リスト 6. TypeInfoProvider クラス
package javax.xml.validation;

public abstract class TypeInfoProvider {

  public abstract TypeInfo getElementTypeInfo();
  public abstract TypeInfo getAttributeTypeInfo(int index);
  public abstract boolean  isIdAttribute(int index);
  public abstract boolean  isSpecified(int index);

}

最後に、SAX の XMLReader を使って文書を構文解析します。リスト 7 に示す簡単なプログラムは、これらのクラスやインターフェースをすべて使用して、文書の中にある要素群のすべての型の名前を出力します。

リスト 7. 要素の型を一覧に出力する
import java.io.*;
import javax.xml.validation.*;

import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class TypeLister extends DefaultHandler {

    private TypeInfoProvider provider;
    
    public TypeLister(TypeInfoProvider provider) {
        this.provider = provider;
    }

    public static void main(String[] args) throws SAXException, IOException {

        SchemaFactory factory 
         = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
        Schema schema = factory.newSchema(schemaLocation);
    
        ValidatorHandler vHandler = schema.newValidatorHandler();
        TypeInfoProvider provider = vHandler.getTypeInfoProvider();
        ContentHandler   cHandler = new TypeLister(provider);
        vHandler.setContentHandler(cHandler);
        
        XMLReader parser = XMLReaderFactory.createXMLReader();
        parser.setContentHandler(vHandler);
        parser.parse(args[0]);
        
    }
    
    public void startElement(String namespace, String localName,
      String qualifiedName, Attributes atts) throws SAXException {
        String type = provider.getElementTypeInfo().getTypeName();
        System.out.println(qualifiedName + ": " + type);
    }

}

このコードを典型的な DocBook 文書に対して実行した場合に得られる出力の先頭は、以下のようになります。

book: #AnonType_book
title: #AnonType_title
subtitle: #AnonType_subtitle
info: #AnonType_info
copyright: #AnonType_copyright
year: #AnonType_year
holder: #AnonType_holder
author: #AnonType_author
personname: #AnonType_personname
firstname: #AnonType_firstname
othername: #AnonType_othername
surname: #AnonType_surname
personblurb: #AnonType_personblurb
para: #AnonType_para
link: #AnonType_link

これを見るとわかるように、DocBook スキーマによって大部分の要素には匿名の複合型が割り当てられます。当然ですが、このようになるかどうかはスキーマごとに異なります。


まとめ

もし世界でたった 1 つの言語しか話されないとしたら、魅力のない世界になってしまうはずです。同様に、プログラマーが 1 つのプログラミング言語しか選択できないとしたら、それはプログラマーにとってありがたくないことでしょう。言語が異なれば得意とする課題は異なり、また一部の課題には複数の言語を必要とします。XML スキーマも例外ではありません。有用なスキーマ言語の選択肢は数多くあります。Java 5 の javax.xml.validation は、そうしたスキーマ言語をすべて処理することができる API です。

参考文献

学ぶために

  • XMLの論考: RELAX NGによる逆襲 第1回」(David Mertz 著、developerWorks、2003年2月) は RELAX NG スキーマ言語を紹介しています。
  • このチュートリアル、「A hands-on introduction to Schematron」(Uche Ogbuji 著、developerWorks、2004年9月) は Schematron スキーマ言語を紹介しています。
  • 『XML 1.1 Bible』(Elliotte Rusty Harold 著、2003年 Wiley 刊) の 20章は W3C XML Schema Language を詳細に紹介しています。
  • XML in a Nutshell』(Elliotte Rusty Harold と W. Scott Means の共著、2005年 O'Reilly 刊) は W3C XML Schema Language と共に DOM と TrAX を詳細に解説しており、また簡単なチュートリアルも含んでいます。
  • Processing XML with Java』(Elliotte Rusty Harold 著、2002年 Addison-Wesley 刊) は、DOM、SAX、TrAX その他の API を使用して Java から XML を利用する方法を解説しています。
  • developerWorks の Java technology ゾーンには、Java プログラミングのあらゆる側面を網羅した記事が豊富に用意されています。
  • developerWorks の XML ゾーンには、広範な話題を網羅した技術記事やヒント、チュートリアル、技術標準、IBM Redbooks などが用意されています。
  • XML および関連技術において IBM 認定技術者になる方法については、IBM XML certification を参照してください。

製品や技術を入手するために

  • DocBook 5.0 は RELAX NG によって正式に定義されています。ユーザーが必要とする場合には、RELAX NG スキーマは DTD や W3C スキーマにコンパイルされます。
  • Java 1.3 と 1.4 用の JAXP 1.3 を java.net からダウンロードしてください。
  • Kohsuke Kawaguchi が作成したアダプター・レイヤーは、いくつかの RELAX NG バリデーター (JING など) でサポートされている古い JARV インターフェースを、この記事で説明した JAXP API に接続することができます。
  • Xerces XML パーサーは、この記事で説明した妥当性検証 API を含めて JAXP 1.3 をサポートしています。
  • IBM ソフトウェアの試用版を developerWorks から直接ダウンロードすることができます。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Java technology
ArticleID=472111
ArticleTitle=XML 妥当性検証のための Java API
publish-date=02102010