トップ     差分 バックアップ   リロード     一覧 単語検索 最終更新
  • Profile
  • Java
    • Java Tips
    • Eclipse, XML
  • Softwares
  • サーバ関係
    • PukiWiki
  • Links

最新の20件
2022-09-03
  • AutoTicketLinkName
2014-10-31
  • PukiWiki/1.4
  • PukiWiki/1.4/Manual
  • Help
  • FormattingRules
  • server/サーバの仕様
2009-02-27
  • FrontPage
2008-09-16
  • links/よく使うツール
  • Profile
2008-08-07
  • gentoo/lvm2+raid1
2006-12-16
  • gentoo/linux-igd
2006-11-23
  • gentoo/PPPoEの設定
  • gentoo
2005-09-14
  • InterWikiName
  • SandBox
2005-04-15
  • MenuBar
2005-04-08
  • links/巡回先
2005-04-07
  • Java/XML/rngomでXMLSchemaのDatatypeLibraryを使う
2005-04-06
  • Java/Tips/Javaで,子プロセスを使うときの注意点
2005-03-26
  • Java/Eclipse/Lomboz J2EE Plugin から,Tomcat 5.0を起動する

(edit)

FrontPage

rngomでXMLSchemaのDatatypeLibraryを使う†

↑

rngom とは†

rngom (RelaxNG Object Model) は,RelaxNG のスキーマを扱うツールを作るためのライブラリです.rngom は,Jingという,RelaxNGの validator をベースに開発されています.

私は,rngom で XMLSchema の datatype library を使おうとしてはまったので,その解決方法のメモです.

以下は,試行錯誤の結果,見つけた解決法です.誤りが含まれている可能性があります

↑

問題†

rngom で XMLSchema の datatype library を使うには,xsdlib が必要です.xsdlib.jar を CLASSPATH に追加することで,利用可能になります. しかし,単にこれを使っても,XMLSchema の datatype を利用できませんでした.

制約チェックをして,パースする場合,RNGOM User's Guide によると,次のようになります.

import org.kohsuke.rngom.ast.util.CheckingSchemaBuilder;

Parseable parseable = ...;
YourParsedPattern = (YourParsedPattern)parseable.parse(new CheckingSchemaBuilder(schemaBuilder,errorHandler));

もっと,具体的なコードで書くと,例えば,次のようになります.

import org.kohsuke.rngom.ast.util.CheckingSchemaBuilder;
import org.kohsuke.rngom.binary.SchemaBuilderImpl;
import org.kohsuke.rngom.parse.Parseable;
import org.kohsuke.rngom.parse.xml.SAXParseable;

Parseable parseable = new SAXParseable(source, errorHandler);
ParsedPattern = parseable.parse(new CheckingSchemaBuilder(new SchemaBuilderImpl() ,errorHandler));

しかし,このコードでは,xsdlib.jar があっても,XMLSchema の datatype が使えません.

↑

原因と解決法†

datatype を定義するには,org.relaxng.datatype.DatatypeLibrary や,org.relaxng.datatype.DatatypeLibraryFactory を実装します. datatype を識別するURIから適切な DatatypeLibrary を返すのは,DatatypeLibraryFactory の実装の仕事です.

問題は,SchemaBuilderImpl です.引数が ErrorHandler のみのコンストラクタで構築すると,コンストラクタは,DatatypeLibraryFactory の実装として org.kohsuke.rngom.dt.builtin.BuiltinDatatypeLibraryFactory を使います.

ところが,org.kohsuke.rngom.dt.builtin.BuiltinDatatypeLibraryFactory は,XMLSchema の datatype の URI (http://www.w3.org/2001/XMLSchema-datatypes) を受け付けません. 次のような実装になっているからです.

public DatatypeLibrary createDatatypeLibrary(String uri) {
    if (uri.equals(""))
        return builtinDatatypeLibrary;
    if (uri.equals(WellKnownNamespaces.RELAX_NG_COMPATIBILITY_DATATYPES))
        return compatibilityDatatypeLibrary;
    return null;
}

代わりに,org.relaxng.datatype.helpers.DatatypeLibraryLoader を使えば,CLASSPATH から,META-INF/services/org.relaxng.datatype.DatatypeLibraryFactory を探して,その内容を元にして org.relaxng.datatype.DatatypeLibraryFactory の実装を見つけてくれるので,xsdlib.jar が提供する XMLSchema の datatype library を使うことが出来ます.

CheckingSchemaBuilder も内部で SchemaBuilderImpl を使っているので,こちらにもDatatypeLibraryFactory を渡してやる必要があります.

コードは,次のようになります.

import org.kohsuke.rngom.ast.builder.SchemaBuilder;
import org.kohsuke.rngom.ast.om.ParsedPattern;
import org.kohsuke.rngom.ast.util.CheckingSchemaBuilder;
import org.kohsuke.rngom.binary.SchemaBuilderImpl;
import org.kohsuke.rngom.binary.SchemaPatternBuilder;
import org.kohsuke.rngom.parse.Parseable;
import org.relaxng.datatype.DatatypeLibraryFactory;
import org.relaxng.datatype.helpers.DatatypeLibraryLoader;
import org.xml.sax.ErrorHandler;

...

ErrorHandler errorHandler = ...;
Parseable parseable = ...;
        
DatatypeLibraryFactory datatypeLibraryFactory = new DatatypeLibraryLoader();
SchemaBuilder schemaBuilder = new SchemaBuilderImpl(errorHandler, datatypeLibraryFactory, new SchemaPatternBuilder());
ParsedPattern pattern = parseable.parse(new CheckingSchemaBuilder(schemaBuilder, errorHandler, datatypeLibraryFactory));
↑

参考資料†

  • RELAX NG Pluggable Datatype Libraries
  • IBM dW : XML : RELAX NGとカスタム・データ型ライブラリ - Japan
トップ   編集 差分 バックアップ リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-04-07 (木) 15:01:33
Link: FrontPage
Site admin: shingo

PukiWiki 1.5.4 © 2001-2022 PukiWiki Development Team. Powered by PHP 8.1.12. HTML convert time: 0.006 sec.