Download - RELAX チュートリアル

Transcript
Page 1: RELAX  チュートリアル

RELAX チュートリアル

川口耕介 Swift,Inc.

Page 2: RELAX  チュートリアル

RELAX って何? XML の書かれ方・書き方を限定する方法です

<?xml version=“1.0” ?><html>

<body><br /></body></html>

例えば、次のような XML は許したいけれども…

<?xml version=“1.0” ?><html>

< ボディ ><br /></ ボディ ></html>

次のような XML は許したくない時

Page 3: RELAX  チュートリアル

RELAX って何? (2) どのような XML は OK なのかの規則を

示す方法です このようなもの全般をスキーマといいま

す DTD, XML Schema, …

XML の書き方を決める方法です 自然言語よりも厳密に決められます

Page 4: RELAX  チュートリアル

スキーマを使うと何が嬉しいの?苦労してスキーマを書く(あるいは、誰かの書いたスキーマを使う)と、次のような良い事があります。

自分が書いた XML が正しいかどうかを自動チェックできます

文法のリファレンスとして役立ちます

Page 5: RELAX  チュートリアル

DTD と比べると…

RELAX DTD

XML で書ける? ○ ×

データ型 ○ ×

表現できる文法 DTD より強力 -

Page 6: RELAX  チュートリアル

データ型「データ型」の機能を使うと、書け

るテキストデータの種類にも制限を設けられます

これは OK

これは NG

<?xml version=“1.0” ?><price>1000</price>

<?xml version=“1.0” ?><price>xyz</price>

Page 7: RELAX  チュートリアル

RELAX 文法の書き方入門

Page 8: RELAX  チュートリアル

1. 最初の雛型を書く

例:トップレベルには html 要素だけがきてよい

<?xml version=“1.0”?><module moduleVersion=“1.0” relaxCoreVersion=“1.0”

xmlns=“http://www.xml.gr.jp/2000/relaxCore”> <export> <interface label=“ トップレベルにきてよい要素名 1” /> <interface label=“ トップレベルにきてよい要素名 2” /> </export>

ここにこれから RELAX 文法の中身を書きます</module>

<?xml version=“1.0”?><module …> <export> <interface label=“html” /> </export> …</module>

Page 9: RELAX  チュートリアル

2. 使う要素名を ( 1つ ) 決める 例: img という要素名を使うことにする

<tag name=“img” />

Page 10: RELAX  チュートリアル

3. 要素に付随する属性を決める 属性の名前を何にするか 属性は必須なのか省略可能なのか 属性の値はどのようなものなのか

何でも良い、数値、 URL 、文字列、 on か off … 例

src 属性は必須、値はなんでもいい height 属性は省略可能で、値は正の整数

<tag name=“img”> <attribute name=“src” required=“true” /> <attribute name=“height” type=“positiveInteger” /> … 必要なだけ …</tag>

Page 11: RELAX  チュートリアル

3'. 属性について 値の種類がうまく指定できない場合

src 属性の値は URL のみにしたいんだけど、どうしたらいいの?

指定したいものより広いデータ型を使って妥協します 例:奇数だけ→整数を全部許すように妥協 例: URL だけ→文字列を全部許すように妥協

Page 12: RELAX  チュートリアル

4. タグの中身:総論 タグの中に書けるもの

中身があってはいけない場合 テキストだけの場合 要素だけの場合 要素もテキストも混在する場合

Page 13: RELAX  チュートリアル

中身があってはいけない場合 基本形

例: img 要素は中に何をも含んではならない

間違いやすい例

<elementRule role=“ 親の要素名” type=“emptyString” />

<elementRule role=“img” type=“emptyString” />

<elementRule role=“img” type=“none” />

Page 14: RELAX  チュートリアル

4.1. テキストだけの場合 基本形

p 要素の中には文字列を書けます

price 要素の中には正の整数が書けます

落とし穴:前後に空白が入ってはいけません

<elementRule role=“p” type=“string” />

<elementRule role=“price” type=“positiveInteger” />

<elementRule role=“ 親の要素名” type=“ 中に入れるデータ型” />

<price> 10000</price>

Page 15: RELAX  チュートリアル

4.2. 要素だけの場合 基本形

本当に困ったら

<elementRule role=“ 親の要素名” >

中にどのように要素が現れてよいかの決まり

</elementRule>

<elementRule role=“ 親の要素名” > <choice occurs=“*”> <ref label=“ 子に現れてよい要素名 1” /> <ref label=“ 子に現れてよい要素名 2” /> … </choice></elementRule>

Page 16: RELAX  チュートリアル

4.3. 要素もテキストも混在 基本形

「要素だけの場合」と一緒ですmix 要素を使います

落とし穴: RELAX ではできないこと次のような XML で、値段の中身を数字に限定することができません

<?xml version=“1.0” ?>< 値段 単位 =“ 円” > 100 < 消費税 >5</ 消費税 ></ 値段 >

Page 17: RELAX  チュートリアル

4.3 要素もテキストも混在 基本形

mixed で囲まれた中には、指示した決まりに従っう要素のほかに、任意のテキストがあらわれてもよいことになります

<elementRule role=“ 親の要素名” > <mixed> 中にどのように要素が現れてよいかの決まり </mixed></elementRule>

Page 18: RELAX  チュートリアル

5. 以上を繰り返し 考えたそれぞれの要素について

名前を決めて tag 要素を書く 付随する属性を決めて attribute 要素を書

く 要素の中身を決めて elementRule 要素を書

のステップを繰り返します

Page 19: RELAX  チュートリアル

子要素の現れ方の指定 基本形

<ref label=“ 子要素の名前” />

<ref label=“ 子要素の名前” occurs=“ 出現の仕方” />

occurs 指定

意味

occurs=“?”

省略可能

occurs=“+”

繰り返し現れても良い

occurs=“*”

省略可能でもあり、かつ繰り返し現れても良い

Page 20: RELAX  チュートリアル

occurs 指定 例 この ref に…

occurs 指定なし occurs=“?” occurs=“+” occurs=“*”

<elementRule role=“body”> <ref label=“p” /></elementRule>

なし ? + *

空 × ○ × ○

P ○ ○ ○ ○

PP × × ○ ○

PPPP × × ○ ○

Page 21: RELAX  チュートリアル

子要素の現れ方の指定 最初はこれ、次にこれ、その次は…

sequence 指定を使います 例: html 要素の中身は、まず head 要素で

次が body 要素

occurs 指定も使えます

<elementRule role=“html”> <sequence> <ref label=“head” /> <ref label=“body” /> </sequence></elementRule>

Page 22: RELAX  チュートリアル

子要素の現れ方の指定 A か、 B か、あるいは C か…

choice 指定を使います 例: img 要素か、 p 要素か、 table 要素が

あらわれていい場合

occurs 指定も使えます

<elementRule role=“html”> <choice> <ref label=“img” /> <ref label=“p” /> <ref label=“table” /> </choice></elementRule>

Page 23: RELAX  チュートリアル

RELAX ではできないこと 次のような指定はうまくできません

どうしてもやりたい人は

login という要素の下には、 user 要素と password 要素と domain 要素が必ず一回登場しなくてはいけないが、しかしその順序はどうでもよい

<elementRule role=“login”> <choice> <sequence> <ref label=“user” /><ref label=“password” /><ref label=“domain” /> </sequence><sequence> <ref label=“user” /><ref label=“domain” /><ref label=“password” /> </sequence><sequence> <ref label=“password” /><ref label=“user” /><ref label=“domain” /> …

Page 24: RELAX  チュートリアル

RELAX 文法を使う

Page 25: RELAX  チュートリアル

RELAX 文法の使い方 XML 文書が文法に沿っているか検査

Verifier 文法のリファレンスとして使います

現在誰かが開発中 ?

Page 26: RELAX  チュートリアル

RELAX Verifier for Java を使う RELAX 文法と、 XML 文書を照合して、間

違いがないかをチェックします (validation)

準備 http://www.swiftinc.co.jp/ から Verifier フルセット版をダウンロードします

Zip に含まれる verifier.jar ファイルをどこかに置きます

準備完了です

Page 27: RELAX  チュートリアル

実際に照合してみましょう

XML 文書が正しく書かれていた場合

RELAX Verifier for Java を使う

C:\>java –jar d:\verifier.jar c:\test.rlx c:\test.xml

RELAX モジュールをロードしていますXML 文書を検証していますXML 文書は RELAX モジュールに対して妥当です

XML 文書が間違っていた場合RELAX モジュールをロードしていますXML 文書を検証していますXML 文書に違反が見つかりました : コンテントモデルが不正です( 3行目 19 文字目)ここに来る事ができるのは次のどれかです : <p>, endTag

Page 28: RELAX  チュートリアル

VBRELAX を使う 準備

http://www.geocities.co.jp/SiliconValley-Bay/4639/vbrelax.htm から VBRELAX をダウンロードしてセットアップ

http://www.geocities.co.jp/SiliconValley-Bay/4639/relaxws/default.htm を開く

エラーが出る場合は、同ページを「信頼済みサイト」に追加するか、標準のセキュリティセッティングを「低」にします

Page 29: RELAX  チュートリアル

VBRELAX を使う 実際に照合してみましょう

上の欄に RELAX 文法を入れます 下の欄に XML 文書を入れます 「 parse 」ボタンを押します

XML 文書が正しく書けていた場合 「 valid 」と出ます

XML 文書が間違っていた場合 エラーメッセージがいろいろ出

ます

Page 30: RELAX  チュートリアル

付録:データ型便覧型名 意味string 文字列。要するに何でもよいboolean “true” か“ false”NCName XML の NCNameinteger 整数“ 1” や“ -195” などdouble 0.256などemptyString 空文字列“”のみnone 全てが駄目