# XML 名前空間

XML 名前空間は URI 参照で識別される名前のコレクションであり、XML 文書内で要素タイプや属性名として使用されます。

XML 名前空間は、2006 年 8 月 16 日付の「Namespaces in XML」という W3C 勧告で規定されています。XML タグ名は、グローバルに固有な名前にしなければならないと同時に、パフォーマンス上の理由から短い名前にしなければなりません。この相反する要求に応えることができるように、W3C の名前空間の勧告では、任意の XML 要素に追加できる xmlns という属性が定義されています。この属性が要素内に存在する場合は、それがその要素の名前空間を表します。

この xmlns 属性は、次の構文で指定します。

`xmlns:prefix=namespace`

ここで、`namespace` には固有の URI (www.ibm.com など)、`prefix` にはその名前空間を表す接頭部を指定します。この接頭部が、その名前空間へのポインターとなります。

以下の顧客 (customer) 要素の定義では、この要素タグを、他のビジネス・アプリケーションで作成された顧客レコード内の要素タグと区別できるように、経理処理 (accounting) 用の名前空間を定義しています。

    <acct:customer xmlns:acct="http://www.my.com/acct-REV10">
    	<acct:name>Corporation</acct:name>
    	<acct:order acct:ref="5566"/>
    	<acct:status>invoice</acct:status>
    </acct:customer>

この名前空間の定義では、1 行目で http://www.my.com/acct-REV10 という名前空間を接頭部に割り当てています。この接頭部は、要素名の中で、たとえばこの名前空間とその要素を結び付けるために使用されます。これとは別のアプリケーション、たとえば注文処理 (fulfillment) システムでは、次のように、別の名前空間をその顧客 (customer) 要素に割り当てることができます。

    <ful:customer xmlns:ful="http://www.your.com/ful">
    	<ful:name>Corporation</ful:name>
    	<ful:order ful:ref="A98756"/>
    	<ful:status>shipped</ful:status>
     </ful:customer>

このようにすると、両方のデータ構造を処理するアプリケーションで、経理処理データと注文処理データを別々に扱うことができます。また、デフォルトの名前空間もあります。これは、名前空間の定義でローカル名が割り当てられていない場合に設定されます。

    <acct:customer xmlns="http://www.my.com/acct-REV10" xmlns:acct="http://www.my.com/acct-REV10 ">
    <name>Corporation</name>
    <order acct:ref="5566"/>
    <status>invoice</status>
    </customer>

この例では、顧客レコード内のすべてのタグが、http://www.my.com/acct-REV10 という名前空間内に存在するものとして、修飾されています。デフォルトの名前空間が使用されているため、接頭部を明示する必要はありません。デフォルトの名前空間は、任意の属性定義に適用されることに注意してください。

#### XML スキーマと名前空間

以下の XML スキーマでは、スキーマのデフォルトの名前空間として、標準の XML スキーマ名前空間 http://www.w3.org/2001/XMLSchema が定義されています。また、スキーマ固有の名前空間として、http://www.ibm.com も定義されています。

    <?xml version="1.0"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:TestSchema="http://www.ibm.com">
     <simpleType name="ZipCodeType">
     <restriction base="integer">
      <minInclusive value="10000"/>
     <maxInclusive value="99999"/>
    </restriction>
     </simpleType>
     <!--element definitions skipped -->
    </schema>

この XML スキーマを C:\temp\TestSchema.xsd として保管した場合、このスキーマに対して検証を行うサンプル XML ファイルは、たとえば次のようになります。

    <?xml version="1.0"?>
    <x:addressList xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://www.ibm.com file:///C:/temp/TestSchema.xsd">
     xsi:schemaLocation="http://www.ibm.com file:///C:/temp/TestSchema.xsd">
    <x:address>
     <x:street>x:Vangerowstrasse</x:street>
      <x:zipCode>69115</x:zipCode>
     <x:city>x:Heidelberg</x:city>
     </x:address>
        <x:address>
    <x:street>x:Bernal Road</x:street>
    <x:zipCode>90375</x:zipCode>
         <x:city>x:San Jose</x:city>
     </x:address>
    </x:addressList>

#### ターゲット名前空間

ターゲット名前空間は、要素と要素名の関連付けが含まれている名前空間を特定するために使用します。宣言の場合、この関連付けによって、このスキーマに適合する XML ファイル内の要素の名前空間が決まります。スキーマをインポートする XML ファイルでは、schemaLocation 属性でターゲット名前空間を参照する必要があります。要素の実際の名前空間とターゲット名前空間の間に不整合があると、スキーマ検証エラーが報告されます。前述の例では、http://www.ibm.com というターゲット名前空間が XML スキーマファイル内で定義されており、それが XML ファイル内で 2 回参照されています。これらの 3 箇所の名前空間の指定の間に不整合があると、検証エラーが発生します。

以下の例は、XML スキーマおよび対応する XML インスタンス文書において、ターゲット名前空間および名前空間の接頭部がどのように機能するかを示しています。

#### 例 1: スキーマ内でデフォルト名前空間およびターゲット名前空間を宣言し、ローカル要素を修飾しない場合

XML スキーマ:

    <?xml version="1.0"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:x="http://www.ibm.com">
    <complexType name="AddressType">
    <sequence>
    <element name="name" type="string"></element>
    </sequence>
    </complexType>
    <element name="MyAddress" type="x:AddressType"></element>
    </schema>

このスキーマから作成した妥当な XML インスタンス文書は、たとえば次のようになります。ローカル要素と属性を修飾していません。

    <?xml version="1.0"?>
    <x:MyAddress xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com x.xsd ">
    <name>Peter Smith</name>
    </x:MyAddress>

XML ファイル内でローカル要素 (「name」要素など) と属性を修飾しない場合は、ルート要素だけを修飾します。したがって、この例では、ルート要素「MyAddress」で「x」という名前空間接頭部を指定して、この要素を名前空間「http://www.ibm.com」に関連付けていますが、ローカル要素「name」では接頭部「x」を指定していません。

#### 例 2: スキーマ内でデフォルト名前空間およびターゲット名前空間を宣言し、ローカル要素を修飾する場合

    <?xml version="1.0"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:x="http://www.ibm.com" elementFormDefault="qualified">
    <complexType name="AddressType">
    <sequence>
    <element name="name" type="string"></element>
    </sequence>
    </complexType>
    <element name="MyAddress" type="x:AddressType"></element>
     </schema>

このスキーマから作成した妥当な XML インスタンス文書は、たとえば次のようになります。この例では、XML スキーマ内で elementFormDefault 属性が修飾名として設定されているため、ローカル要素と属性を修飾しています。

    <?xml version="1.0"?>
      <x:MyAddress xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.ibm.com x.xsd ">
    <x:name>Peter Smith</x:name>
     </x:MyAddress>

この例では、ルート要素「MyAddress」およびローカル要素「name」で「x」という名前空間接頭部を指定して、これらの要素を名前空間「http://www.ibm.com」に関連付けています。

#### 例 3: スキーマ内でターゲット名前空間を宣言し、xmlns:xsd を明示的に定義する場合

この XML スキーマは、次の属性を追加します。

`xmlns:xsd="http://www.w3.org/2001/XMLSchema`

これは、XML スキーマ言語によって定義される各構成を接頭部「xsd」で修飾する必要があることを意味しています。たとえば、xsd:complexType、xsd:string のようにします。

なお、「xs」、「foobar」などのその他の任意の接頭部を指定して、宣言内や記述内で使用することもできます。

この接頭部は、XML スキーマの設定ページで指定できます。詳しくは、関連タスクを参照してください。

ユーザー定義型はすべて、targetNamespace 属性で定義されている名前空間 http://www.ibm.com に属します。接頭部は、xmlns:x 属性で定義されている「x」となります。

    <?xml version="1.0"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:x="http://www.ibm.com">
    <xsd:complexType name="AddressType">
    <xsd:sequence>
    		 <xsd:element name="name" type="xsd:string"></xsd:element>
    </xsd:sequence>
     </xsd:complexType>
     <xsd:element name="MyAddress" type="x:AddressType"></xsd:element>
    </xsd:schema>

このスキーマから作成した妥当な XML インスタンス文書は、たとえば次のようになります。ローカル要素と属性を修飾していません。修飾のセマンティックは、例 1 と同じです。

    <?xml version="1.0"?>
     <x:MyAddress xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ibm.com x.xsd ">
    <name>Peter Smith</name>
     </x:MyAddress>

#### 例 4: スキーマ内で、xmlns:xsd を明示的に定義するターゲット名前空間を宣言しない場合

この XML スキーマでは、それ自体でターゲット名前空間が宣言されていません。この場合は、すべての XML スキーマ構成を明示的に「xsd」などの接頭部で修飾することを強く推奨します。名前空間の接頭部がないため、AddressType などのこのスキーマの定義と宣言は、名前空間を修飾せずに参照しています。

    <?xml version="1.0"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:complexType name="AddressType">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"></xsd:element>
    <xsd:element name="name" type="xsd:string"></xsd:element>
    <xsd:element name="name" type="xsd:string"></xsd:element>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:element name="MyAddress" type="AddressType"></xsd:element>
    </xsd:schema>

このスキーマから作成した妥当な XML インスタンス文書は、たとえば次のようになります。この例では、どの要素も修飾されていません。

    <?xml version="1.0"?>
    <MyAddress xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="x.xsd">
    <name>name</name>
    </MyAddress>

#### 例 5: ターゲット名前空間がデフォルトの名前空間になるスキーマ

この XML スキーマでは、ターゲット名前空間がデフォルトの名前空間になります。この例でも、名前空間の接頭部はありません。

    <?xml version="1.0"?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns="http://www.ibm.com">
    <xsd:complexType name="AddressType">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"></xsd:element>
    </xsd:sequence>
    </xsd:complexType>
     <xsd:element name="MyAddress" type="AddressType"></xsd:element>
     </xsd:schema>

このスキーマから作成した妥当な XML インスタンス文書は、たとえば次のようになります。

    <?xml version="1.0" encoding="UTF-8"?>
    <MyAddress xmlns="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com NewXMLSchema.xsd">
    <name>name</name>
     </MyAddress>

関連タスク
XML スキーマ・ファイル関連の設定の編集