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が正しいかどうかを自 動チェックできます 文法のリファレンスとして役立ちます DTDと比べると… RELAX DTD XMLで書ける? ○ × データ型 ○ × DTDより強力 - 表現できる文法 データ型 「データ型」の機能を使うと、書けるテキスト データの種類にも制限を設けられます これはOK <?xml version=“1.0” ?> <price>1000</price> これはNG <?xml version=“1.0” ?> <price>xyz</price> RELAX文法の書き方入門 1.最初の雛型を書く <?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> 例:トップレベルにはhtml要素だけがきてよい <?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> 3'.属性について 値の種類がうまく指定できない場合 src属性の値はURLのみにしたいんだけど、どうした らいいの? 指定したいものより広いデータ型を使って妥協し ます 例:奇数だけ→整数を全部許すように妥協 例:URLだけ→文字列を全部許すように妥協 4.タグの中身:総論 タグの中に書けるもの 中身があってはいけない場合 テキストだけの場合 要素だけの場合 要素もテキストも混在する場合 中身があってはいけない場合 基本形 <elementRule role=“親の要素名” type=“emptyString” /> 例:img要素は中に何をも含んではならな い <elementRule role=“img” type=“emptyString” /> 間違いやすい例 <elementRule role=“img” type=“none” /> 4.1.テキストだけの場合 基本形 <elementRule role=“親の要素名” type=“中に入れるデータ型” /> p要素の中には文字列を書けます <elementRule role=“p” type=“string” /> price要素の中には正の整数が書けます <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=“出現の仕方”/> occurs指定 occurs=“?” occurs=“+ ” occurs=“* ” 意味 省略可能 繰り返し現れても良い 省略可能でもあり、かつ繰り返し 現れても良い occurs指定 例 このrefに… <elementRule role=“body”> <ref label=“p” /> </elementRule> 空 P PP PPPP なし × ○ × × ? ○ ○ × × occurs指定なし occurs=“?” occurs=“+” occurs=“*” + × ○ ○ ○ * ○ ○ ○ ○ 子要素の現れ方の指定 最初はこれ、次にこれ、その次は… sequence指定を使います 例:html要素の中身は、まずhead要素で次が body要素 <elementRule role=“html”> <sequence> <ref label=“head” /> <ref label=“body” /> </sequence> </elementRule> occurs指定も使えます 子要素の現れ方の指定 Aか、Bか、あるいはCか… choice指定を使います 例:img要素か、p要素か、table要素があらわ れていい場合 <elementRule role=“html”> <choice> <ref label=“img” /> <ref label=“p” /> <ref label=“table” /> </choice> </elementRule> occurs指定も使えます 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文法を使う RELAX文法の使い方 XML文書が文法に沿っているか検査 Verifier 文法のリファレンスとして使います 現在誰かが開発中? RELAX Verifier for Javaを使う RELAX文法と、XML文書を照合して、間 違いがないかをチェックします (validation) 準備 http://www.swiftinc.co.jp/ からVerifierフル セット版をダウンロードします Zipに含まれるverifier.jarファイルをどこかに 置きます 準備完了です RELAX Verifier for Javaを使う 実際に照合してみましょう C:\>java –jar d:\verifier.jar c:\test.rlx c:\test.xml XML文書が正しく書かれていた場合 RELAXモジュールをロードしています XML文書を検証しています XML文書はRELAXモジュールに対して妥当です XML文書が間違っていた場合 RELAXモジュールをロードしています XML文書を検証しています XML文書に違反が見つかりました: コンテントモデルが不正です (3行目19文字目) ここに来る事ができるのは次のどれかです: <p>, endTag VBRELAXを使う 準備 http://www.geocities.co.jp/SiliconValleyBay/4639/vbrelax.htm からVBRELAXをダウ ンロードしてセットアップ http://www.geocities.co.jp/SiliconValleyBay/4639/relaxws/default.htm を開く エラーが出る場合は、同ページを「信頼済み サイト」に追加するか、標準のセキュリティセッ ティングを「低」にします VBRELAXを使う 実際に照合してみましょう XML文書が正しく書けていた 場合 上の欄にRELAX文法を入れます 下の欄にXML文書を入れます 「parse」ボタンを押します 「valid」と出ます XML文書が間違っていた場合 エラーメッセージがいろいろ出ま す 付録:データ型便覧 型名 string boolean NCName integer double emptyString none 意味 文字列。要するに何でもよい “true”か“false” XMLのNCName 整数“1”や“-195”など 0.256など 空文字列“”のみ 全てが駄目
© Copyright 2024 ExpyDoc