300 likes | 437 Views
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).
E N D
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なのかの規則を示す方法です • このようなもの全般をスキーマといいます • DTD, XML Schema, … • XMLの書き方を決める方法です • 自然言語よりも厳密に決められます
自分が書いたXMLが正しいかどうかを自動チェックできます自分が書いたXMLが正しいかどうかを自動チェックできます 文法のリファレンスとして役立ちます スキーマを使うと何が嬉しいの? 苦労してスキーマを書く(あるいは、誰かの書いたスキーマを使う)と、次のような良い事があります。
データ型 「データ型」の機能を使うと、書けるテキストデータの種類にも制限を設けられます • これはOK • これはNG <?xml version=“1.0” ?><price>1000</price> <?xml version=“1.0” ?><price>xyz</price>
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>
2.使う要素名を(1つ)決める • 例:imgという要素名を使うことにする <tag name=“img” />
3.要素に付随する属性を決める • 属性の名前を何にするか • 属性は必須なのか省略可能なのか • 属性の値はどのようなものなのか • 何でも良い、数値、URL、文字列、onかoff … • 例 • src属性は必須、値はなんでもいい • height属性は省略可能で、値は正の整数 <tag name=“img”> <attribute name=“src” required=“true” /> <attribute name=“height” type=“positiveInteger” /> …必要なだけ … </tag>
値の種類がうまく指定できない場合 src属性の値はURLのみにしたいんだけど、どうしたらいいの? 指定したいものより広いデータ型を使って妥協します 例:奇数だけ→整数を全部許すように妥協 例:URLだけ→文字列を全部許すように妥協 3'.属性について
4.タグの中身:総論 • タグの中に書けるもの • 中身があってはいけない場合 • テキストだけの場合 • 要素だけの場合 • 要素もテキストも混在する場合
中身があってはいけない場合 • 基本形 • 例:img要素は中に何をも含んではならない • 間違いやすい例 <elementRule role=“親の要素名”type=“emptyString” /> <elementRule role=“img” type=“emptyString” /> <elementRule role=“img” type=“none” />
4.1.テキストだけの場合 • 基本形 • p要素の中には文字列を書けます • price要素の中には正の整数が書けます • 落とし穴:前後に空白が入ってはいけません <elementRule role=“親の要素名”type=“中に入れるデータ型”/> <elementRule role=“p” type=“string” /> <elementRule role=“price” type=“positiveInteger” /> <price> 10000 </price>
4.2.要素だけの場合 • 基本形 • 本当に困ったら <elementRule role=“親の要素名”> 中にどのように要素が現れてよいかの決まり </elementRule> <elementRule role=“親の要素名”> <choice occurs=“*”> <ref label=“子に現れてよい要素名1” /> <ref label=“子に現れてよい要素名2” /> … </choice> </elementRule>
4.3.要素もテキストも混在 • 基本形 「要素だけの場合」と一緒です mix要素を使います • 落とし穴:RELAXではできないこと 次のようなXMLで、値段の中身を数字に限定することができません <?xml version=“1.0” ?><値段 単位=“円”> 100 <消費税>5</消費税> </値段>
4.3 要素もテキストも混在 • 基本形 • mixedで囲まれた中には、指示した決まりに従っう要素のほかに、任意のテキストがあらわれてもよいことになります <elementRule role=“親の要素名”> <mixed> 中にどのように要素が現れてよいかの決まり </mixed> </elementRule>
5.以上を繰り返し • 考えたそれぞれの要素について • 名前を決めてtag要素を書く • 付随する属性を決めてattribute要素を書く • 要素の中身を決めてelementRule要素を書く のステップを繰り返します
子要素の現れ方の指定 • 基本形 <ref label=“子要素の名前”/> <ref label=“子要素の名前”occurs=“出現の仕方”/>
例 このrefに… occurs指定なし occurs=“?” occurs=“+” occurs=“*” occurs指定 <elementRule role=“body”> <ref label=“p” /> </elementRule>
子要素の現れ方の指定 • 最初はこれ、次にこれ、その次は… • 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” /> </sequence><sequence> <ref label=“password” /><ref label=“user” /><ref label=“domain” /> …
RELAX文法の使い方 • XML文書が文法に沿っているか検査 • Verifier • 文法のリファレンスとして使います • 現在誰かが開発中?
RELAX Verifier for Javaを使う • RELAX文法と、XML文書を照合して、間違いがないかをチェックします(validation) • 準備 • http://www.swiftinc.co.jp/からVerifierフルセット版をダウンロードします • Zipに含まれるverifier.jarファイルをどこかに置きます • 準備完了です
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を使う • 実際に照合してみましょう • 上の欄にRELAX文法を入れます • 下の欄にXML文書を入れます • 「parse」ボタンを押します • XML文書が正しく書けていた場合 • 「valid」と出ます • XML文書が間違っていた場合 • エラーメッセージがいろいろ出ます