レベル: 初級 Nicholas Chase (ibmquestions@nicholaschase.com), Freelance writer, Backstop Media
2007年 7月 31日 XML を妥当性検査することで、受け入れ可能なデータを定義する複雑なルールを作成することができます。しかしそうしたルールは、実際に使わない限り誰の役にも立ちません。このヒントでは、XML Schema Standard Type Library を使って、E メール・アドレスや電話番号などの書式設定のあるデータを要求するプロセスを単純化する方法を学びます。
このヒントは、皆さんが XML について理解しており、また XML Schema について少なくとも概要程度の知識があることを前提としています。この記事のサンプルでは XForms を使いますが、XForms について理解している必要はありません。(サンプルを実行するためには、Firefox 用の XForms 拡張機能を http://www.mozilla.org/projects/xforms/ からダウンロードする必要があります。)
XML を妥当性検査できる機能、つまり型に基づく何らかの制約を満たすことを保証できる機能は XML 自体に元々備わっており、Document Type Definitions は XML 仕様の一部です。一層の柔軟性と強力さが必要であることが明らかになって、まもなく XML Schema が生まれました。XML Schema を使うことで、非常に詳細な定義を作成することができます。例えば、ある要素が特定数の追加要素を含まなければならないように指定したり、ある属性が、日時の値や一定のパターンに従うテキスト、あるいは他の任意の構造などを含まなければならないように指定したりすることができます。
例えば、次の XForms フォームを考えてみてください (リスト 1)。
リスト 1. 基本的なフォーム
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:xforms="http://www.w3.org/2002/xforms"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<head>
<title>Contact Form</title>
<xforms:model>
<xforms:instance id="content">
<contact xmlns="">
<name />
<email />
<phone />
</contact>
</xforms:instance>
<xforms:submission id="submitContact" method="post"
action="." />
</xforms:model>
<link href="gen_default.css" rel="stylesheet"/>
</head>
<body>
<h1 align="center">Contact information</h1>
<xforms:input ref="/contact/name">
<xforms:label>Name: </xforms:label>
</xforms:input>
<br />
<xforms:input ref="/contact/email">
<xforms:label>Email: </xforms:label>
</xforms:input>
<br />
<xforms:input ref="/contact/phone">
<xforms:label>Phone: </xforms:label>
</xforms:input>
<br />
<xforms:submit submission="submitContact">
<xforms:label>Submit</xforms:label>
</xforms:submit>
</body>
</html>
|
このフォームは非常に単純であり、ユーザーの名前と E メール・アドレス、そして電話番号を入力する欄があるだけです (図 1)。
図 1. フォーム
この場合、E メールと電話番号用の入力を、有効な E メール・アドレスと電話番号に制限するか、あるいは少なくとも、それらが適切な形式のアドレスと番号であるように制限した方が便利です。そのためには、この文書にスキーマを追加する必要があります (リスト 2)。
リスト 2. スキーマを追加する
...
<xforms:model>
<xsd:element name="contact">
<xsd:complexType>
<xsd:element name="name" xsd:type="xsd:string" />
<xsd:element name="email" />
<xsd:element name="phone" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
<xforms:instance id="content">
<contact xmlns="">
<name />
<email />
<phone />
</contact>
</xforms:instance>
...
|
次に、これらのエントリーのうちの 1 つが無効だった場合にユーザーに通知するイベントを追加します (この方法についてはソースコードを見てください)。
現在は E メールと電話番号の定義に型が指定されていないことに注目してください。その理由は、これらの型をチェックしようとすると、正直言って大部分のプログラマーが手間をかけるのをためらうほど面倒になるからです。E メール・アドレスには標準のフォーマットがありますが、実際にはいくつかの形式があります。電話番号も同様ですが、「市外局番あり」、「市外局番なし」、「内線あり」など無限と思えるほどのパターンがあり、その上さらに国コードを考慮する必要があります。
一体誰がそんなチェックをしたいと望むでしょう。少なくとも私はしたくありません。幸い、電話番号や E メール・アドレスなどの一般的な型のライブラリーがあるのです。この XML スキーマ標準型ライブラリーは、http://www.codesynthesis.com/projects/xsstl/ からダウンロードすることができます。このライブラリーをスキーマに追加するには、適当な名前空間と文書をインポートするだけです (リスト 3)。
リスト 3. スキーマ定義をインポートする
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ev="http://www.w3.org/2001/xml-events"
xmlns:xforms="http://www.w3.org/2002/xforms"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:stl="http://www.codesynthesis.com/xmlns/xsstl">
<head>
<title>Contact Form</title>
<xforms:model>
<xsd:schema targetNamespace=""
xmlns:stl="http://www.codesynthesis.com/xmlns/xsstl">
<xsd:import
namespace="http://www.codesynthesis.com/xmlns/xsstl"
schemaLocation="xsstl.xsd"/>
<xsd:element name="contact">
<xsd:complexType>
<xsd:element name="name" xsd:type="xsd:string" />
<xsd:element name="email" xsd:type="stl:EmailAddress" />
<xsd:element name="phone" xsd:type="stl:PhoneNumber" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
<xforms:instance id="content">
<contact xmlns="">
<name />
<email />
<phone />
</contact>
</xforms:instance>
<xforms:bind nodeset="/contact/email"
type="stl:EmailAddress"/>
<xforms:bind nodeset="/contact/phone"
type="stl:PhoneNumber"/>
<xforms:submission id="submitContact" method="post"
action="." />
...
|
ここに示した手法は、XForms フォームに埋め込まれたスキーマ文書に使えるだけではなく、任意のスキーマ文書にも使うことができます。必ず適当な名前空間エイリアス (この場合は stl:) を定義し、そして実際の名前空間とスキーマ文書をインポートする必要があります。そうすると、これらの型を、スキーマで定義された他の型とまったく同じように使うことができます。この例の場合では、フォームは EmailAddress 型と PhoneNumber 型を使っています。
この例では、メインの文書をインポートし、すべての型を利用可能にしています。しかし、実際に必要な文書のみをインポートするようにもできます。XML Schema Standard Type Library には、1 つの型を持つ、いくつかの文書が含まれています。
- email-address.xsd:
EmailAddress 型は、データを標準の E メール・アドレスに制限します。
- percentage.xsd:
Percentage 型は、0 以上 100 以下の数字を表します。
- iso3166-country-code.xsd:
ISO3166CountyCode 型はデータに対して、2 文字のストリングであること、そして実際に ISO 3166-1 の国コードの 1 つであること、という 2 つの制限を課します。
- rfc822-date-time.xsd:
RFC822DateTime 型は、データが RFC822 の仕様に従って適切にフォーマットされていることを要求します。
ある 1 つの型に関するバリエーションを含む他の文書もあります。
- ipv4-address.xsd: このファイルは、(ドット表記で) 適切な IP アドレスとポートを表す、
IPv4Address や Port、IPv4Endpoint などの適切なエンドポイントのバリエーションを含みます。またこのファイルは、1 つのストリングを含むのではなく、データの構造化バージョンである IPv4EndpointStruct を含みます。
- phone-number.xsd: この文書は、電話番号のさまざまな部分 (
PhoneCountryCode や PhoneAreaCode 、PhoneSubscriberNumber 、PhoneExtensionNumber など) や、それらをすべて組み合わせて少なくとも加入者番号を要求する 1 つのストリングである PhoneNumber、またさまざまな部分を個々の要素に分割する struct である PhoneNumberStruct などの仕様を定めています。
- us-state-code.xsd: この文書は、「アメリカ合衆国の州」の定義に関するいくつかのバリエーションを含んでいます。これらの中には、例えば
USStateTerritoryCode (50 の州と 9 つの米領を含む) や、USStateCode (州とワシントンD.C. のみを含む)、USTerritoryCode (米領バージン諸島などの米領を含み、ワシントンD.C. は含まない)、USContinentalStateCode (ハワイを除くすべての州とワシントン特別区を含む)、USContiguousStateCode (ハワイとアラスカを除くすべての州とワシントン特別区を含む) などがあります。
まとめ
XML Schema Standard Type Library は、モジュールの定義を作成することで楽をすることができる一例です。これらの定義を独自のスキーマにインポートすることによって、皆さん自身が型を定義する手間をかけなくても、これらの型を使うことができるようになります。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Sample code | x-tipxsslt-source.zip | 1KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | |  | Nicholas Chase は、Lucent Technologies や Sun Microsystems、Oracle、the Tampa Bay Buccaneers などの会社で Web サイト開発に携わってきました。彼は高校の物理の先生であり、低レベル放射性廃棄物施設の管理者であり、オンライン SF 雑誌の編集者であり、マルチメディアのエンジニアであり、Oracle インストラクターであり、あるインタラクティブ・コミュニケーション会社の最高技術責任者でもあります。『XML Primer Plus』(Sams 刊) を含めて、何冊かの著作があります。 |
記事の評価
|