XML Schema達人への道
基礎4:名前空間とXML Schema-その2
2002年9月11日更新
(株)日本ユニテック
奥井 康弘
<この記事はDigital
Xpress 2001 Vol.8(4-5月号)に掲載されたものです>
前回、名前空間にXML Schemaがどのように対応しているかの説明を行いました。今回はその続きとして、まず、名前空間に属さない要素や属性について解説します。そして、その後、名前空間接頭辞の付け方についてグローバル/ローカルな要素や属性というXML
Schemaの新しい考え方について説明します。
名前空間のないスキーマ文書?
前回の記事では、xsd:schemaにおいてtargetNamespace属性を指定することによって、そのスキーマ文書で定義した要素や属性が、どの名前空間に属すものなのかを宣言すると説明しました。
【スキーマ文書-memo.xsd】
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.utj.co.jp/namespaces/memo"
targetNamespace="http://www.utj.co.jp/namespaces/memo">
<xsd:element name="memo">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="to"/>
<xsd:element ref="from"/>
<xsd:element ref="date"/>
<xsd:element ref="time"/>
<xsd:element ref="body"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="to" type="xsd:string"/>
<xsd:element name="from" type="xsd:string"/>
<xsd:element name="date" type="xsd:date"/>
<xsd:element name="time" type="xsd:string"/>
<xsd:element name="body" type="xsd:string"/>
</xsd:schema>
|
【XMLデータ】
<mm:memo xmlns:mm="http://www.utj.co.jp/nameapaces/memo"
xmlns:od="http://www.utj.co.jp/nameapaces/oder"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.utj.co.jp/nameapaces/memo
memo.xsd">
<mm:to>HONDA</mm:to>
<mm:from>OKUI</mm:from>
<mm:date>2002-02-02</mm:date>
<mm:time>12:00</mm:time>
<mm:body>お客様より本の注文がありました。</mm:body>
</mm:memo> |
このtargetNamespace属性を使った対象名前空間の宣言がない場合、そのスキーマ文書で表現されたスキーマに属する要素や属性は、特定の名前空間に属しません。さて、名前空間に属さないとはどういうことなのでしょうか?
名前空間に属さない要素や属性を利用するシナリオは次のようなものです。
● そのスキーマ文書で宣言された要素や属性だけしか使わないので、名前空間を使って要素や属性を区別する必要がない
これは、いままでDTDに基づいてXMLデータを書いていたときの考え方と同じです。つまり、1つのXMLデータに対しては、タグセットを規定する1つのDTDしか存在しませんでした。特定分野でのXML利用では、使用するスキーマが定まっている場合があり、それを他に利用する必要もないかもしれません。そのようなときには、わざわざ名前空間という考え方を使う必要はないということです。
この場合、スキーマ文書を特定する指定には、xsi:noNamespaceSchemaLocationを使用します。xsi:schemaLocationは、名前空間とスキーマ文書の対で指定しましたが、xsi:noNamespaceSchemaLocationの場合、名前空間はありませんので、スキーマ文書だけを指定します。
次の例は、先ほどのスキーマ文書memo.xsdにおいて、対象名前空間の指定がなかった場合のXMLデータの書き方です。
【XMLデータ】
<?xml version="1.0"?>
<memo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="memo.xsd">
<to>次郎</to>
<from>太郎</from>
<date>2002-04-01</date>
<time>12:00</time>
<body>お花見に行きたいね。</body>
</memo> |
名前空間に属さないスキーマ文書には、次のような別の用途もあります。
● 他のスキーマにインクルードされることによって、他のスキーマの属する名前空間の一部となるような"共用"の要素や属性を定義したい
前回説明したインクルード機能は、別ファイルで定義された要素や属性を自分のスキーマ文書に書いたものと見なす機能でした。インクルード機能を使っているスキーマ文書が何らかの名前空間に属すものとして対象名前空間を宣言したものであれば、インクルードされた要素や属性は、その名前空間に属すものとして"同化"するのです。
次のスキーマ文書は対象名前空間を指定しないcommon.xsdをインクルードしています。名前空間に属さない型定義を参照するには、名前空間に属さない名前で参照します。
【スキーマ文書-notice.xsd】
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.utj.co.jp/schemas/notice">
<xsd:include schemaLocation="common.xsd"/>
<xsd:element name="notice">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="title"/>
<xsd:element name="body">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="para" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
|
【対象名前空間を指定しないスキーマ文書-common.xsd】
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="para" type="xsd:string"/>
</xsd:schema> |
titleやparaという使いまわしができそうな要素をcommon.xsdという対象名前空間を宣言しないスキーマ文書として定義しておき、それをインクルードしています。これによって、memo2.xsdを使用したXMLデータにおいては、次のように、titleもparaも、"http://www.utj.co.jp/schemas/notice"という名前空間に属すものとして使用することになります。
<?xml version="1.0"?>
<n:notice
xmlns:n="http://www.utj.co.jp/nameapaces/notice"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.utj.co.jp/schemas/memo
memo2.xsd">
<n:title>お花見に行こう!</n:title>
<n:body>
<n:para>春らしい毎日です。来週お花見に行きたいですね。</n:para>
</n:body>
</n:notice> |
さて、対象名前空間に関係した話はこのくらいにしてXML Schemaで決まっている名前空間接頭辞の付け方について説明しましょう。
>>続いて「グローバルな要素とローカルな要素」についてみてみましょう。
関連サービス
XMLスキーマの策定、作成業務
関連キーワード: XMLスキーマ
関連キーワード: 名前空間
|