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

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

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

2002年08月27日作成 

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

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

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

名前空間とは

名前空間(namespace)とは、XMLの世界では、要素や属性の名前の集合のことを指します。XML1.0では、DTDを規定することによってmemoとかdateとかtimeなどの名前が決まりました。XMLインスタンスを書くときには、これらの名前をタグとして使用します。

<? xml version="1.0">
<memo>
  <to>HONDA</to>
  <from>OKUI</from>
  <date>2002-02-02</date>
  <time>12:00</time>
  <body>明日、13:00から会議を行いますのでよろしくお願いいたします。</body>
</memo>

さて、DTDなどで決まるこのような名前は、XMLインスタンスで1つというのがXML1.0の基本です。したがって、DTDを伴って検証済みXML文書を書く場合には、1つのDTD+1つのXMLインスタンスという構造になります。

でも、さまざまなDTDが開発されるようになると、他の人が作ったDTDで定義された要素や属性を使いたくなります。そうすれば、DTDを拡張する手間が省けるからです。たとえば、HTMLを使っているときに、数式を書きたくなるかもしれません。このようなときに、HTMLの中に数式のタグを混在させることができれば便利です。これが、名前空間という考え方の原点です。混在させて使用するDTDの要素名や属性名が全く異なれば、要素名や属性名を見れば、どのDTDで作ったものかが識別できますが、同じ名前の要素があった場合に、それらが別のDTDのものであることを理解できるような考え方と仕組みが必要です。この考え方を整理したのが名前空間です。この名前空間の考え方は、XML名前空間(Namespaces in XML)という規格としてW3Cによって1999年1月14日に定められました。

XMLインスタンスと名前空間

たとえば、受発注を表す要素集合を上記のメモの要素集合の中に書くことを考えましょう。このとき、メモの要素名の前にはmmという接頭辞を付け、コロン(:)の後にtoやfromなど、メモ用の名前空間に属する要素名を書きます。受発注の要素には、odという接頭辞を使用することにします。

<? xml version="1.0">
<mm:memo xmlns:mm="http://www.utj.co.jp/namespaces/memo" xmlns:od="http://www.utj.co.jp/namespaces/oder">
  <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>

このように、接頭辞を付けた要素名のことを修飾名(qualified name)と呼びます。その書き方は次のとおりです。

修飾名の書き方

接頭辞 : 要素名

さて、接頭辞はどのようにして決めるのでしょうか?それは、接頭辞を使う前(上位)の要素で名前空間宣言を行うことによって決めます。前述の例の場合、最上位要素にあるxmlns:XXXX="...."という部分がこれに当たります。これは属性の形をしています。xmlns:の後に接頭辞を書き、属性値にあたる部分には、名前空間を表すURIを書きます。このURIは名前空間の「名前」として使われます。名前の表現にURIが採用されたのは、世界で唯一の名前を割り振ることができるからです。多くの場合、これはURLの形をしています。上記の例の場合、xmlns:mm="http://www.utj.co.jp/namespaces/memo"においては、メモの名前空間を表すURIとしてhttp://www.utj.co.jp/namespaces/memoを使っています。URLの形はしていても実態は単なる「名前」あるいは「ラベル」です。したがって、"http://www.utj.co.jp/namespaces/memo"というファイルが存在するわけではないことに注意してください。

名前空間宣言の書き方

xmlns:接頭辞="名前空間を表すURI"

名前空間とDTD

さて、複数の名前空間を混在させたXMLインスタンスを書く方法は説明しましたが、これとXML1.0で要素や属性の構造を規定するDTDとの関係はどうなるのでしょうか。前述のXMLインスタンスを表現するDTDで書くと次のようになります。

<!ELEMENT mm:memo (mm:from, mm:to, mm:date, mm:time, mm:body, od:order)>
<!ELEMENT mm:from (#PCDATA)>
<!ELEMENT mm:to (#PCDATA)>
<!ELEMENT mm:date (#PCDATA)>
<!ELEMENT mm:time (#PCDATA)>
<!ELEMENT od:order (od:customer, od:item, od:quantity)>
<!ELEMENT od:customer (#PCDATA)>
<!ELEMENT od:item (#PCDATA)>
<!ELEMENT od:quantity (#PCDATA)>

しかし、名前空間を含む要素や属性をDTDで表現することには次のようないくつかの問題点があります。

●名前空間を加える度にDTDを書き換えなければならない
●名前空間接頭辞が固定である
●他の名前空間を使う場所が固定である

名前空間接頭辞は、任意のものが使えるはずなのに、DTDでは固定されており意味がない、つまり、「DTDはもともと名前空間を扱うようには設計されてはいない」ということになります。そこで、XML Schemaの出番となるわけです。

>>続いて「XML Schemaでの名前空間の扱い方」をみてみましょう。




関連サービス

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



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

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


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




ページトップへ戻る