XML 名前空間

XML 名前空間は名前の集合で、URI 参照で識別されて、XML 文書内で要素タイプおよび属性名として使用されます。

XML 名前空間は、 「Namespaces in XML」という名称の W3C 勧告 (2006 年 8 月 16 日) で定義されています。XML タグ名はグローバルに固有でなければならず、またパフォーマンス上の理由から短い名前にする必要があります。 この競合を解決するために、W3C の名前空間勧告は、任意の XML 要素を修正できる属性 xmlns を定義しています。 要素内にこの属性がある場合、この要素の名前空間を識別しています。

xmlns 属性の構文は次のとおりです。

xmlns:prefix=namespace

ここで、namespace は固有の URI (たとえば www.ibm.com)、prefix は名前空間を表現しており、名前空間へのポインターを示します。

次に示す customer 要素の定義の中では、他のビジネス・アプリケーションによって作成された顧客レコードにあるタグと、 要素のタグを区別できるように、会計用の名前空間が定義されています。

<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>  

最初の行にある名前空間定義は、 名前空間 http://www.my.com/acct-REV10 を接頭部に割り当てています。この接頭部は、名前空間に要素を関連付けるために、name などの要素名に付けて使用されます。 別のアプリケーション、例えば配送業務システムは、 次のように 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 インスタンス文書は、次のようなものです。 ローカル要素および属性は unqualified です。

<?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> 

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

サンプル 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 インスタンス文書は、次のようなものです。 ローカル要素および属性は qualified です。これは、elementFormDefault 属性 が XML スキーマで qualified に設定されているからです。

<?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>

この例では、「x」名前空間接頭部がルート要素「MyAddress」とローカル要素「name」の両方に割り当てられ、これらの要素が名前空間「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 インスタンス文書は、次のようなものです。 ローカル要素および属性は unqualified です。修飾のセマンティクスはサンプル 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 スキーマ自体には、ターゲット名前空間はありません。 この場合は、「xsd」などの接頭部を使用して、すべての XML スキーマ構成体を明示的に修飾することを強くお薦めします。名前空間接頭部が存在しないので 、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 インスタンス文書は、次のようなものです。 すべての要素は unqualified です。

<?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 スキーマ・ファイル設定の編集