RELAX チュートリアル 川口耕介 Swift,Inc.
RELAXって何? XMLの書かれ方・書き方を限定する方法です 例えば、次のようなXMLは許したいけれども… <?xml version=“1.0” ?> <html> <body><br /></body> </html> 次のようなXMLは許したくない時 <?xml version=“1.0” ?> <html> <ボディ><br /></ボディ> </html>
RELAXって何?(2) どのようなXMLはOKなのかの規則を示す方法です XMLの書き方を決める方法です このようなもの全般をスキーマといいます DTD, XML Schema, … XMLの書き方を決める方法です 自然言語よりも厳密に決められます
スキーマを使うと何が嬉しいの? 苦労してスキーマを書く(あるいは、誰かの書いたスキーマを使う)と、次のような良い事があります。 間違いをしてしまった場所、間違いの内容などを教えてもらえます。 正しいXMLはどのように記述されるべきなのかの情報を含んでいるので、それを「読んで」どのようなXMLは正しいのかを知ることが出来ます。 ただし、リファレンスに使えるだけで、チュートリアルには使えません。最初に覚える人向けのわかりやすい解説は別に必要です。 自分が書いたXMLが正しいかどうかを自動チェックできます 文法のリファレンスとして役立ちます
DTDと比べると… RELAX DTD XMLで書ける? ○ × データ型 表現できる文法 DTDより強力 - XMLで書けるので 文法を覚える必要がありません プログラムからも取り扱いが容易です データ型は、文字列の部分にも検証をかける方法です 表現できる文法というのは難しい概念です。 でも、強力な部分は説明しません。
データ型 「データ型」の機能を使うと、書けるテキストデータの種類にも制限を設けられます これはOK これはNG <?xml version=“1.0” ?> <price>1000</price> 自分でデータ型を決めることも出来ます <?xml version=“1.0” ?> <price>xyz</price>
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> おまじないです interface要素は複数書くことも出来ます 例:トップレベルにはhtml要素だけがきてよい <?xml version=“1.0”?> <module …> <export> <interface label=“html” /> </export> … </module>
2.使う要素名を(1つ)決める 例:imgという要素名を使うことにする <tag name=“img” />
3.要素に付随する属性を決める 属性の名前を何にするか 属性は必須なのか省略可能なのか 属性の値はどのようなものなのか 例 何でも良い、数値、URL、文字列、onかoff … 例 src属性は必須、値はなんでもいい height属性は省略可能で、値は正の整数 @requiredを省略すると、falseを指定したのと一緒。 @typeを省略すると、何でもいいことになる。 <tag name=“img”> <attribute name=“src” required=“true” /> <attribute name=“height” type=“positiveInteger” /> … 必要なだけ … </tag>
3'.属性について 値の種類がうまく指定できない場合 指定したいものより広いデータ型を使って妥協します src属性の値はURLのみにしたいんだけど、どうしたらいいの? 頑張ると、ある程度は頑張れます。 でも、とりあえず妥協しておいて後で直すことは簡単です。 でも、妥協しないで頑張ってしまうと、スキーマが出来ません。 +自然言語でコメントを書きます 指定したいものより広いデータ型を使って妥協します 例:奇数だけ→整数を全部許すように妥協 例:URLだけ→文字列を全部許すように妥協
4.タグの中身:総論 タグの中に書けるもの 中身があってはいけない場合 テキストだけの場合 要素だけの場合 要素もテキストも混在する場合 ここが一番難しいところ
中身があってはいけない場合 基本形 例:img要素は中に何をも含んではならない 間違いやすい例 <elementRule role=“親の要素名” type=“emptyString” /> <elementRule role=“img” type=“emptyString” /> なぜnoneでは駄目なのか <elementRule role=“img” type=“none” />
4.1.テキストだけの場合 基本形 p要素の中には文字列を書けます price要素の中には正の整数が書けます 落とし穴:前後に空白が入ってはいけません <elementRule role=“親の要素名” type=“中に入れるデータ型” /> <elementRule role=“p” type=“string” /> pitfallに注意しましょう。この制限は嫌いな人もいるでしょう。 <elementRule role=“price” type=“positiveInteger” /> <price> 10000 </price>
4.2.要素だけの場合 基本形 本当に困ったら <elementRule role=“親の要素名”> 中にどのように要素が現れてよいかの決まり </elementRule> emergency exitがあるので、迷ったらとりあえず妥協しましょう。 後できちんと書き換えればよいのです。 <elementRule role=“親の要素名”> <choice occurs=“*”> <ref label=“子に現れてよい要素名1” /> <ref label=“子に現れてよい要素名2” /> … </choice> </elementRule>
4.3.要素もテキストも混在 基本形 落とし穴:RELAXではできないこと 「要素だけの場合」と一緒です mix要素を使います 次のようなXMLで、値段の中身を数字に限定することができません mixedの説明が抜けてる <?xml version=“1.0” ?> <値段 単位=“円”> 100 <消費税>5</消費税> </値段>
4.3 要素もテキストも混在 基本形 mixedで囲まれた中には、指示した決まりに従っう要素のほかに、任意のテキストがあらわれてもよいことになります <elementRule role=“親の要素名”> <mixed> 中にどのように要素が現れてよいかの決まり </mixed> </elementRule>
5.以上を繰り返し 考えたそれぞれの要素について のステップを繰り返します 名前を決めてtag要素を書く 付随する属性を決めてattribute要素を書く 要素の中身を決めてelementRule要素を書く のステップを繰り返します
子要素の現れ方の指定 基本形 occurs指定 意味 occurs=“?” 省略可能 occurs=“+” 繰り返し現れても良い <ref label=“子要素の名前” /> <ref label=“子要素の名前” occurs=“出現の仕方”/> occurs指定 意味 occurs=“?” 省略可能 occurs=“+” 繰り返し現れても良い occurs=“*” 省略可能でもあり、かつ繰り返し現れても良い
occurs指定 例 このrefに… なし ? + * 空 × ○ P PP PPPP occurs指定なし occurs=“?” <elementRule role=“body”> <ref label=“p” /> </elementRule> なし ? + * 空 × ○ P PP PPPP
子要素の現れ方の指定 最初はこれ、次にこれ、その次は… sequence指定を使います 例:html要素の中身は、まずhead要素で次がbody要素 occurs指定も使えます <elementRule role=“html”> <sequence> <ref label=“head” /> <ref label=“body” /> </sequence> </elementRule>
子要素の現れ方の指定 Aか、Bか、あるいはCか… choice指定を使います 例:img要素か、p要素か、table要素があらわれていい場合 occurs指定も使えます <elementRule role=“html”> <choice> <ref label=“img” /> <ref label=“p” /> <ref label=“table” /> </choice> </elementRule>
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” /> <ref label=“password” /><ref label=“user” /><ref label=“domain” /> …
RELAX文法を使う
RELAX文法の使い方 XML文書が文法に沿っているか検査 Verifier 文法のリファレンスとして使います 現在誰かが開発中?
RELAX Verifier for Javaを使う RELAX文法と、XML文書を照合して、間違いがないかをチェックします(validation) 準備 http://www.swiftinc.co.jp/ からVerifierフルセット版をダウンロードします Zipに含まれるverifier.jarファイルをどこかに置きます 準備完了です RELAX文法を書くと、XMLにどのような制限を加えることが出来るか見てみましょう。
RELAX Verifier for Javaを使う 実際に照合してみましょう XML文書が正しく書かれていた場合 C:\>java –jar d:\verifier.jar c:\test.rlx c:\test.xml RELAXモジュールをロードしています XML文書を検証しています XML文書はRELAXモジュールに対して妥当です XML文書が間違っていた場合 RELAXモジュールをロードしています XML文書を検証しています XML文書に違反が見つかりました: コンテントモデルが不正です (3行目19文字目) ここに来る事ができるのは次のどれかです: <p>, endTag
VBRELAXを使う 準備 http://www.geocities.co.jp/SiliconValley-Bay/4639/vbrelax.htm からVBRELAXをダウンロードしてセットアップ http://www.geocities.co.jp/SiliconValley-Bay/4639/relaxws/default.htm を開く エラーが出る場合は、同ページを「信頼済みサイト」に追加するか、標準のセキュリティセッティングを「低」にします
VBRELAXを使う 実際に照合してみましょう XML文書が正しく書けていた場合 XML文書が間違っていた場合 「parse」ボタンを押します XML文書が正しく書けていた場合 「valid」と出ます XML文書が間違っていた場合 エラーメッセージがいろいろ出ます
付録:データ型便覧 型名 意味 string 文字列。要するに何でもよい boolean “true”か“false” NCName XMLのNCName integer 整数“1”や“-195”など double 0.256など emptyString 空文字列“”のみ none 全てが駄目