名前空間

Revised: Oct./05th/2003

XML名前空間

XML文書は機械処理することを前提としています。このとき、複雑な作業の場合は、複数文書を関連させる必要が生じることがあります。異なるスキーマが混在しているとき、nameやidのような汎用的な要素名/属性名などの識別子が重複して、衝突する可能性も少なくありません。あるいは、既存のスキーマからちょっとだけ変えたいという場合にも、複数のスキーマを混在させることが、モジュール化の観点から望ましいことです。

XML名前空間(Namespaces in XML)は、1999年1月にW3Cで勧告され、スキーマに属する要素名/属性名を特定のURI (Universal Resource Identifier)に結び付けて、ユニバーサルな名前を持たせる仕組みです。URIというのは、URL (Universal/Unified Resource Locator)とURN (Universal Resource Name)を併せた概念で、いわゆるURLを拡張したものだと認識していただければよいでしょう。

XML名前空間では、スキーマが混在した文書を取り扱う際には、要素名/属性名の前に、スキーマを示すURIと結びついた接頭語を付けるようにします。URIはスキーマごとに一意でありさえすればよく、DTDのSYSTEM識別子のように、そこからスキーマが取得できる必要はありません。また、接頭辞は各文書例毎に任意の接頭辞をそのつど名前空間に関連付ければよく、ユニバーサルに決まっている必要はありません。

DTDの最大の難点は、名前空間をサポートしないことです。妥当性制約の検証で名前空間を利用するためには、DTD側で要素名/属性名を接頭辞つきで定義しておくことが必要であり、本来は動的に文書側で定義可能な接頭辞を固定しなければなりません。名前空間を自由に利用する場合は、XML SchemaやRELAX NGなどの後発のスキーマ言語を使う必要があります。

リスト4は名前空間 "urn:address" の XMLSchema が "address.xsd" から得られる場合の、名前空間を使ったXML文書の一例です。接頭辞xsiに関連付けた名前空間 "http://www.w3.org/2001/XMLSchema-instance" では、組み込み属性の type, nil, schemaLoaction, noNamespaceSchemaLocation などが定義されています。

リスト4. XML Schemaと名前空間を使ったXML文書(demo5.xml)

<?xml version="1.0" encoding="UTF-8"?>
<hlq:address xmlns:hlq="urn:address"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:address address.xsd">
    <hlq:item sex="male" custid="E21099">
        <hlq:name>菅井 学</hlq:name>
        <hlq:access kind="email"></hlq:access>
        <hlq:access kind="url">http://www.nextindex.net/java/</hlq:access>
        <hlq:image file="msugai.png" />
    </hlq:item>
    <hlq:item sex="male" custid="E27989">
        <hlq:name>鈴木 竜広</hlq:name>
        <hlq:access kind="email">tsuzuki@hoge.foo.bar</hlq:access>
        <hlq:image file="tsuzuki.png" />
    </hlq:item>
    <hlq:item sex="female" custid="E29435">
        <hlq:name>栃原 宏枝</hlq:name>
        <hlq:access kind="tel">090-xxxx-xxxx</hlq:access>
        <hlq:image file="tochi.png" />
    </hlq:item>
</hlq:address>

リスト4では、属性に名前空間接頭辞を指定していません。属性にも名前空間接頭辞を付けることができて、接頭辞を持たない属性は、名前空間に属しません。しかし、属性を要素の付属物と考えられる場合は、指定しないでも済みます。

例えば、名前空間接頭辞がpr1:とpr2:で、各々が属性nameを持っている場合、一つの要素に属性pr1:nameとpr2:nameを指定することが可能です。ただし、pr1とpr2が同じ名前空間に関連づいていれば、一つの要素に二つの同じ属性が登場してはいけないという規則に照らして不正となります。

リスト4では、ほとんどの要素が名前空間接頭辞hlqに属していますので、接頭辞を持たないデフォルト名前空間にしたほうが現実的です(リスト5)。

リスト5

<?xml version="1.0" encoding="UTF-8"?>
<hlq:address xmlns="urn:address"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:address address.xsd">
    <item sex="male" custid="E21099">
        <name>菅井 学</name>
        <access kind="email"></access>
...

文書の型(スキーマ)を定義するのに、名前空間の仕組みを包括するためには、DTD では役者が足りません。次に紹介する XML Schema は W3C が勧告する一つの方法です。



Copyright © 2003 SUGAI, Manabu. All Rights Reserved.
SEO [PR] !uO z[y[WJ Cu