目次へ

9.2 XML 文書内のNamespace指定

Target Namespaceを持つXML Schemaに沿った文書を記述する場合、要素や属性がどのNamespaceに属するのか、意識することが非常に重要です。しかし、XML Schemaの厄介なところは、Namespaceを指定しなければいけない要素、属性と、指定してはいけない要素、属性があることです。指定するかしないかは、その要素や属性がGlobalなのか、Localなのかに、深く関わっています。

まず、Globalなものです。Global要素やGlobal属性は、必ず、そのNamespaceを指定する必要があります。Global要素の場合、Namespaceを指定する方法にはデフォルトNamespaceを使用する方法と、Namespace接頭辞を使用する方法があります。Global属性の場合は、Namespace接頭辞によりのみ指定できます。デフォルトNamespaceを使用して指定できるのは、要素のNamespaceのみだからです。

以下に例を示します。

次に、Localなものです。Local要素や、Local属性に関して、Namespaceを特定するかしないかは、XML Schema文書に定められています。それは、schema要素のelementFormDefault属性および、attributeFormDefault属性です。

 
<schema targetNamespace="本文書で定義している言語のNamespaceのURI"
        elementFormDefault="Local要素のNamespaceを指定するかどうか"
        attributeFormDefault="Local属性のNamespaceを指定するかどうか">
...

</schema>

elementFormDefault、attributeFormDefaultの属性値は、qualifiedかunqualified、どちらかを指定します。qualifiedを指定した場合、Local要素もしくは属性のNamespaceを特定しなければいけません。unqualifiedを指定した場合は、Local要素、もしくは属性のNamespaceを特定してはいけません。デフォルトの値は、unqualifiedです。

例えば、以下のXML Schemaがあったとします。

 
<?xml version="1.0"?>
<schema     xmlns="http://www.w3.org/2001/XMLSchema"
       targetNamespace="http://www.example.com/PO1"
            xmlns:po="http://www.example.com/PO1"
            elementFormDefault="unqualified"
            attributeFormDefault="unqualified">

 <element name="purchaseOrder" type="po:PurchaseOrderType"/>
 <element name="comment" type="string"/>

 <complexType name="PurchaseOrderType">
  <sequence>
   <element name="shipTo" type="po:USAddress"/>
   <elemanet name="billTo" type="po:USAddress"/>
   <element ref="po:comment" minOccurs="0"/>
   <!-- etc -->
  </sequence>
  <attribute name="orderDate" type="date">
</complexType>

 <complexType name="USAddress”>
  <sequence>
   <element name"name" type="string" />
   <element name="street" type="string"/>
  </sequence>
 </complexType>

 <!-- etc -->

</schema>

上の文書では、elementFormDefault属性も、attributeFormDefault属性もunqualifiedに設定されています。これより、shipTo、name等のLocal要素のNamespaceは特定されていない必要があります。上のスキーマに沿った文書を以下に記述します。

 
<?xml version="1.0"?>
<apo:purchaseOrder xmlns:apo="http://www.example.com/PO1"
                   orderDate="1999-10-20>

 <shipTo>
  <name>Alice Smith</name>
  <street>123 Maple Street</street>
  <!--- etc. --->
 </shipTo>

 <billTo coutry="US">
  <name>Robert Smith</name>
  <street>8 Oak Avenue</street>
 </billTo>

 <apo:comment>Hurry,my lawn is going wild!</apo:comment>

 <!-- etc -->
</apo:purchaseOrder>

Global要素要素のpurchaseOrder、commentには、Namespace接頭辞がついています。Global要素は、必ず、Namespace接頭辞をつけるか、デフォルトNamespaceを指定して、Namespaceを特定する必要があります.しかし、他の要素はLocal要素なので、Namespace接頭辞はついていません。elementFormDefaultがunqualifiedに設定されているため、Local要素にはNamespace接頭辞をつけてはいけないのです。注意しなければいけないのは、以下の文書がエラーになるということです。

 
<?xml version="1.0"?>
<purchaseOrder xmlns="http://www.example.com/PO1"
                   orderDate="1999-10-20>

 <shipTo>
  <name>Alice Smith</name>
  <street>123 Maple Street</street>
  <!--- etc. --->
 </shipTo>

 <billTo coutry="US">
  <name>Robert Smith</name>
  <street>8 Oak Avenue</street>
 </billTo>

 <comment>Hurry,my lawn is going wild!</comment>

 <!-- etc -->
</purchaseOrder>

以上の文書には、デフォルトNamespaceが設定が記述されています。これにより、shipTo、name等の要素のNamespaceは"http://www.example.com/PO1"に指定されていることになります。これは、elementFormDefaultのunqualified指定に反します。よって、エラーになります。

逆に、Local要素もLocal属性も、Namespaceを指定しなければいけないように設定します。

 
<?xml version="1.0"?>
<schema     xmlns="http://www.w3.org/2001/XMLSchema"
       targetNamespace="http://www.example.com/PO1"
            xmlns:po="http://www.example.com/PO1"
            elementFormDefault="qualified"
            attributeFormDefault="qualified">

 <element name="purchaseOrder" type="po:PurchaseOrderType"/>
 <element name="comment" type="string"/>

 <complexType name="PurchaseOrderType">
  <sequence>
   <element name="shipTo" type="po:USAddress"/>
   <element name="billTo" type="po:USAddress"/>
   <element ref="po:comment" minOccurs="0"/>
   <!-- etc -->
  </sequence>
  <attribute name="orderDate" type="date">
</complexType>

 <complexType name="USAddress”>
  <sequence>
   <element name"name" type="string" />
   <element name="street" type="string"/>
  </sequence>
 </complexType>

 <!-- etc -->

</schema>

すると、以下のように、すべての要素、属性のNamespaceを記述する必要があります。

 
<?xml version="1.0"?>
<apo:purchaseOrder xmlns:apo="http://www.example.com/PO1"
                   apo:orderDate="1999-10-20>

 <apo:shipTo>
  <apo:name>Alice Smith</apo:name>
  <apo:street>123 Maple Street</apo:street>
  <!--- etc. --->
 </apo:shipTo>

 <apo:billTo >
  <apo:name>Robert Smith</name>
  <apo:street>8 Oak Avenue</apo:street>
 </apo:billTo>

 <apo:comment>Hurry,my lawn is going wild!</apo:comment>

 <!-- etc -->
</apo:purchaseOrder>

デフォルトNamespaceを使用して記述すれば以下のようになります。

 
<?xml version="1.0"?>
<purchaseOrder xmlns="http://www.example.com/PO1"
               xmlns:apo="http://www.example.com/PO1"
                   apo:orderDate="1999-10-20>

 <shipTo>
  <name>Alice Smith</name>
  <street>123 Maple Street</street>
  <!--- etc. --->
 </shipTo>

 <billTo coutry="US">
  <name>Robert Smith</name>
  <street>8 Oak Avenue</street>
 </billTo>

 <comment>Hurry,my lawn is going wild!</comment>

 <!-- etc -->
</purchaseOrder>

orderDate属性には、Namespace接頭辞が記述してあることに注意してください。デフォルトNamespaceで、指定しているのは、要素のNamespaceのみです。属性のNamespaceはNamespace接頭辞により設定する必要があります。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp