RELAX チュートリアル

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など
空文字列“”のみ
全てが駄目