ホーム > X-Plus > XML Square >  デベロッパーズコーナー  >  エンジニアのためのXMLスキーマ講座

この記事を送る はてなブックマークに追加する BuzzurlにブックマークBuzzurlにブックマーク Yahoo!ブックマークに登録
テキストリンクコードを取得する

デベロッパーズコーナー:エンジニアのためのXMLスキーマ講座「基礎3:名前空間とXML Schema」(3)

2002年08月27日作成 

XML Schema達人への道
基礎3:名前空間とXML Schema
(株)日本ユニテック
奥井 康弘

<この記事はDigital Xpress 2001 Vol.7(2-3月号)に掲載されたものです>

今回は、XML Schemaが対応しているXMLの重要な概念「名前空間」について説明します。この名前空間は、XMLの利用の幅を広げる重要な考え方ですので、ちょっと難しいかもしれませんがしっかりとついてきてください。

<<前ページ「名前空間を意識したXML Schemaのスキーマ文書の書き方」について

名前空間に対応したXML Schemaの書き方

ところで、「XML名前空間」規格は、XMLインスタンスにおける要素や属性での名前空間の識別方法については規定していますが、複数の名前空間の要素や属性の構造をどのように混在させるかについては、何も定めていません。これは、名前空間をサポートするスキーマ規格の問題となります。XML Schemaの場合、次のパターンのいずれかで他の名前空間を書くことになります。

1)他の名前空間組み込み型
2)任意の名前空間組み込み型

このように、ある名前空間のスキーマの構造を定義するときに、他の名前空間の要素や属性をその一部として使用する場合、他の名前空間の要素や属性を使用するために、それを定義したスキーマ文書を取り込む機能をインポート(import)と呼びます。

インポートを行うには、スキーマ文書中でxsd:importを使用します。これは次のように書きます。

異なる名前空間のスキーマ文書を参照する方法:

<xsd:import namespace="インポートする名前空間のURI"
 schemaLocation="インポートする名前空間を定義したスキーマ文書のURI"/>

インポートを行った上で、異なる名前空間の要素、属性、型を参照するには、その名前空間の名前空間接頭辞を使います。そのためにxsd:schemaでインポートする名前空間に関する名前空間宣言をします。

では、他の名前空間組み込みパターン1の実現方法をこのインポート機能を使って書いてみましょう。先程のmemo.xsdを改良します。

(スキーマ文書 memo.xsd ― 他の名前空間をインポートしたもの)
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.utj.co.jp/namespaces/memo"
xmlns:od="http://www.utj.co.jp/namespaces/order"
targetNamespace="http://www.utj.co.jp/namespaces/memo">

  <xsd:import namespace="http://www.utj.co.jp/namespaces/order"
schemaLocation="order.xsd"/>


  <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:element ref="od:order"/>
      </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>


(スキーマ文書order.xsd)
<?xml version="1.0"?>
<xsd:schema
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns="http://www.utj.co.jp/namespaces/order"
  targetNamespace="http://www.utj.co.jp/namespaces/order">

  <xsd:element name="order">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="customer"/>
        <xsd:element ref="item"/>
        <xsd:element ref="quantity"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="customer" type="xsd:string"/>
  <xsd:element name="item" type="xsd:string"/>
  <xsd:element name="quantity" type="xsd:positiveInteger"/>

</xsd:schema>

これを使ったXMLインスタンスは次のようになります。xsi:schemaLocationで指定するスキーマ文書は、インポートを行ったメモ用のスキーマ文書だけであることに注意してください。これは、そのスキーマ文書を読めば、その中に受発注用のスキーマ文書を使っていることが分かるからです。

<?xml version="1.0"?>
<mm:memo
  xmlns:mm="http://www.utj.co.jp/namespaces/memo"
  xmlns:od="http://www.utj.co.jp/namespaces/oder"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation=
"http://www.utj.co.jp/namespaces/memomemo.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>
  <od:order>
    <od:customer>安藤</od:customer>
    <od:item>お気楽Q&A XML</od:item>
    <od:quantity>2</od:quantity>
  </od:order>
</mm:memo>

では次に、他の名前空間組み込みパターン2の実現方法を考えましょう。この場合、スキーマ文書においてxsd:anyを使用します。

任意の名前空間の使用の許可

スキーマ文書においてxsd:anyを指定することによって、その場所に任意の名前空間に属す要素や属性を書くことができます。

(スキーマ文書 memo.xsd - xsd:anyを使用したもの)
<?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:any/>
      </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>

このようにすることによって、xsd:anyの部分に現れる要素は何でもよくなりますので、スキーマ文書においても受発注用の名前空間の宣言を行う必要はなくなります。

インポートの場合と異なり、xsd:anyを使った定義を含むスキーマ文書は、その場所に書かれる任意の名前空間を定義したスキーマ文書に関する情報を含んでいませんから、その部分に書く要素(この場合は受発注用スキーマ)のスキーマ文書が何かをXMLインスタンスのxsi:schemaLocation属性で指定することになります。

<?xml version="1.0"?>
<mm:memo
xmlns:mm="http://www.utj.co.jp/namespaces/memo"
xmlns:book="http://www.utj.co.jp/namespaces/book"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.utj.co.jp/namespaces/memo
memo.xsd
http://www.utj.co.jp/namespaces/book
book.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>
<book:title>お気楽Q&amp;A XML</book:title>
</mm:memo>

(※接頭辞bookの名前空間スキーマ文書book.xsdは省略)

今回は、名前空間の基本として、その考え方と、XML Schemaがそれをどのようにサポートしているかを説明しました。次回は、XML Schemaにおける名前空間の説明の続きを行います。お楽しみに。

>>次の記事「名前空間とXML Schema その2」




関連サービス

XMLスキーマの策定、作成業務



この記事と関連の高い記事

関連キーワード:XMLスキーマ


関連キーワード:名前空間




ページトップへ戻る