DB2 によるXMLスキーマの管理とXML データの妥当性検証

XMLスキーマには、名前空間を持つものや持たないもの、複数のXMLスキーマから構成されるもの、複数の名前空間から構成されるものなどがあります。この記事では、それらのXMLスキーマやXML データを例に取り上げ、DB2 を利用したXMLスキーマの登録方法やXML データの妥当性検証方法、妥当性検証に利用したXMLスキーマの取得方法などについてご紹介します。 なお、この記事は、DB2 9.7 for Linux, UNIX and Windows に基づいて述べられています。

大川 昌弘, IM開発, 大和ソフトウェア開発研究所, 日本アイ・ビー・エム株式会社

大川 昌弘は、ソフトウェア開発研究所のデータベース関連製品開発部門に所属するソフトウェアエンジニアで、現在は主にデータベースツール製品の開発やテストに従事しています。



2009年 11月 19日

はじめに

W3Cで勧告されているXMLスキーマは、XMLスキーマが定義されている場所を示すロケーション情報(以下、スキーマ・ロケーションと呼びます)を記述することができます。XMLデータにはその妥当性検証に使用するためのXMLスキーマを、XMLスキーマにはincludeやimportなどにより参照するXMLスキーマを取得するためにスキーマ・ロケーションを指定することができます。W3Cでは、これらのスキーマ・ロケーションはあくまでもヒントであり、かつ、XMLスキーマを処理するプログラムはスキーマ・ロケーションを使用しなくてもよい規定となっています。

そこでDB2では、XMLデータを妥当性検証する際、スキーマ・ロケーションを使用してXMLスキーマを取得する方法のほかに、リレーショナルIDと呼ぶユニークなIDを使用してXMLスキーマを取得する方法を提供しています(図1)。

図1. DB2によるXMLスキーマの管理(XMLスキーマ・リポジトリー)
図1. DB2によるXMLスキーマの管理(XMLスキーマ・リポジトリー)

XMLスキーマにはさまざまな種類があります。この記事では、以下のケースを取り上げ、具体的な例を挙げて、XMLスキーマの登録方法、XMLデータの妥当性検証方法、妥当性検証に利用したXMLスキーマの取得方法などについて説明します。

  1. 名前空間なしXMLスキーマ
    例: リスト1のcustomer1.xsd (XMLスキーマ), リスト7のcustomer1.xml (XMLデータ)
  2. 名前空間なしXMLスキーマ (別の名前空間なしXMLスキーマを参照)
    例: リスト2とリスト3のcustomer2.xsd, company2.xsd (XMLスキーマ), リスト9のcustomer2.xml (XMLデータ)
  3. 名前空間ありXMLスキーマ
    例: リスト4のcustomer3.xsd (XMLスキーマ), リスト10のcustomer3.xml (XMLデータ)
  4. 名前空間ありXMLスキーマ (異なる名前空間を持つXMLスキーマを参照)
    例: リスト5とリスト6のcustomer4.xsd, company4.xsd (XMLスキーマ), リスト11のcustomer4.xml (XMLデータ)

XMLスキーマの登録

DB2におけるXMLスキーマの登録は以下のステップで行います。

  1. 主となるXMLスキーマの登録(REGISTER XMLSCHEMAコマンド)
  2. includeやimportしているXMLスキーマの追加登録(ADD XMLSCHEMAコマンド)
    (*) 1のオプションを利用して複数のXMLスキーマを登録することもできます。
  3. 登録したXMLスキーマの検証と使用可能化(COMPLETE XMLSCHEMAコマンド)

以下、いくつかのXMLスキーマを例に説明します。

名前空間なしXMLスキーマ

customer1.xsdは、名前空間なしXMLスキーマの例です。

リスト 1. customer1.xsd (XMLスキーマ)
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="customer">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="address" type="xs:string"/>
                <xs:element name="phone" type="xs:string"/>
                <xs:element name="email" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="type" type="xs:string"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

XMLスキーマをDB2に登録する際、そのXMLスキーマに対応するリレーショナルIDとスキーマ・ロケーションを指定します。リレーショナルIDは、DB2の表名などと同様、スキーマ名も保持します。上記のリレーショナルIDをSAMPLE.CUSTOMER1、スキーマ・ロケーションをcustomer1.xsd とすると、以下のDB2のコマンドでXMLスキーマを登録することができます。(/work/customer1.xsdファイルにこのXMLスキーマが定義されていると想定します。以降、必要なファイルはすべて/workディレクトリ下に置かれていると想定します。)

REGISTER XMLSCHEMA 'customer1.xsd'
FROM '/work/customer1.xsd' AS SAMPLE.CUSTOMER1;

続いて、以下のコマンドにより、登録したXMLスキーマを検証し使用可能状態にします。

COMPLETE XMLSCHEMA SAMPLE.CUSTOMER1;

ちなみに、登録したXMLスキーマを削除するには、以下のコマンドを発行します。

DROP XSROBJECT SAMPLE.CUSTOMER1;

名前空間なしXMLスキーマ (別の名前空間なしXMLスキーマを参照)

参照元も参照先も名前空間なしの場合、あるいは、同じ名前空間を持つ場合、includeエレメントを使用して参照先のスキーマ・ロケーションを指定します。DB2では、参照先のXMLスキーマを参照元と同じスキーマ・ロケーション/リレーショナルIDに追加登録して保持しますが、それらのXMLスキーマをリポジトリー内部で区別するためにincludeエレメントで指定されたスキーマ・ロケーションを指定して追加登録します。つまり、DB2では、XMLデータの妥当性検証で使用可能なスキーマ・ロケーションとリレーショナルIDのほかに、XMLスキーマ・リポジトリー内部で使用するスキーマ・ロケーションを管理します(図2)。

図2. XMLスキーマ・リポジトリー内部で管理されるスキーマ・ロケーション
図2. XMLスキーマ・リポジトリー内部で管理されるスキーマ・ロケーション

customer2.xsdは、名前空間なしXMLスキーマで、別の名前空間なしXMLスキーマcompany2.xsdを参照しています。

リスト 2. customer2.xsd (XMLスキーマ)
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:include schemaLocation="company2.xsd"/>
    <xs:element name="customer">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="address" type="xs:string"/>
                <xs:element name="phone" type="xs:string"/>
                <xs:element name="email" type="xs:string"/>
                <xs:element ref="company-name"/>
                <xs:element ref="company-address"/>
            </xs:sequence>
            <xs:attribute name="type" type="xs:string"/>
        </xs:complexType>
    </xs:element>
</xs:schema>
リスト 3. company2.xsd (XMLスキーマ)
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="company-name" type="xs:string"/>
    <xs:element name="company-address" type="xs:string"/>
</xs:schema>

上記2つのXMLスキーマが保持されるリレーショナルIDをSAMPLE.CUSTOMER2、スキーマ・ロケーションをcustomer2.xsdとします。

まず、最初のXMLスキーマcustomer2.xsdを以下のコマンドで登録します。

REGISTER XMLSCHEMA 'customer2.xsd'
FROM '/work/customer2.xsd' AS SAMPLE.CUSTOMER2;

次にXMLスキーマcompany2.xsdを追加登録します。追加の際、XMLスキーマ・リポジトリー内部で管理するためのスキーマ・ロケーションとして、includeエレメントのschemaLocation属性で指定されたスキーマ・ロケーションを指定します(この例ではcompany2.xsd)。DB2は、XMLスキーマの検証時、includeされたXMLスキーマを取得する際、ここで登録したスキーマ・ロケーションから該当するXMLスキーマを特定します。

ADD XMLSCHEMA DOCUMENT TO SAMPLE.CUSTOMER2 ADD 'company2.xsd'
FROM '/work/company2.xsd';

最後に、登録したXMLスキーマを検証し使用可能状態とします。

COMPLETE XMLSCHEMA SAMPLE.CUSTOMER2;

名前空間ありXMLスキーマ

customer3.xsdは、"http://www.sample.com/customer" という名前空間に属すエレメントを定義しているXMLスキーマの例です。

リスト 4. customer3.xsd (XMLスキーマ)
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.sample.com/customer"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified">
    <xs:element name="customer">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="address" type="xs:string"/>
                <xs:element name="phone" type="xs:string"/>
                <xs:element name="email" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="type" type="xs:string"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

XMLスキーマの登録は、名前空間なしの場合と同様です。リレーショナルIDをSAMPLE.CUSTOMER3、スキーマ・ロケーションをcustomer3.xsdとすると、以下のコマンドで登録します。

REGISTER XMLSCHEMA 'customer3.xsd'
FROM '/work/customer3.xsd' AS SAMPLE.CUSTOMER3;

以下のコマンドで登録したXMLスキーマの検証および使用可能化を行います。

COMPLETE XMLSCHEMA SAMPLE.CUSTOMER3;

名前空間ありXMLスキーマ (異なる名前空間を持つXMLスキーマを参照)

XMLスキーマから異なる名前空間を持つXMLスキーマを参照する場合、importエレメントを使用して参照先の名前空間とスキーマ・ロケーションを指定します。スキーマ・ロケーションは、XMLスキーマを処理するプログラムが使用しなければ省略可能です。DB2では、importエレメントに指定されたスキーマ・ロケーションを参照せず、名前空間のみを使用してXMLスキーマを特定しますので、importエレメントに指定可能な参照先のスキーマ・ロケーションは省略可能です。

customer4.xsdは、"http://www.sample.com/customer" という名前空間に属すエレメントを定義しており、"http://www.sample.com/company"という名前空間に属すエレメントを保持するcompany4.xsdを参照しているXMLスキーマの例です。customer4.xsdのimportエレメントのschemaLocation属性は省略可能です。

リスト 5. customer4.xsd (XMLスキーマ)
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.sample.com/customer"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:com="http://www.sample.com/company"
        elementFormDefault="qualified">
    <xs:import namespace="http://www.sample.com/company" schemaLocation="company4.xsd"/>
    <xs:element name="customer">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="address" type="xs:string"/>
                <xs:element name="phone" type="xs:string"/>
                <xs:element name="email" type="xs:string"/>
                <xs:element ref="com:name"/>
                <xs:element ref="com:address"/>
            </xs:sequence>
            <xs:attribute name="type" type="xs:string"/>
        </xs:complexType>
    </xs:element>
</xs:schema>
リスト 6. company4.xsd (XMLスキーマ)
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.sample.com/company"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified">
    <xs:element name="name" type="xs:string"/>
    <xs:element name="address" type="xs:string"/>
</xs:schema>

上記2つのXMLスキーマが保持されるリレーショナルIDをSAMPLE.CUSTOMER4、スキーマ・ロケーションをcustomer4.xsdとします。

まず、最初のXMLスキーマcustomer4.xsdを以下のコマンドで登録します。

REGISTER XMLSCHEMA 'customer4.xsd'
FROM '/work/customer4.xsd' AS SAMPLE.CUSTOMER4;

次にXMLスキーマcompany4.xsdを追加します。追加の際、XMLスキーマ・リポジトリー内部で管理するためのスキーマ・ロケーションを指定します。異なる名前空間のXMLスキーマを参照する際、名前空間でXMLスキーマを特定しますので、スキーマ・ロケーションは何でも構いません。この例では、管理が容易になるように、importエレメントのschemaLocation属性を省略せず、かつ、その名前を使用してcompany4.xsdを追加登録しています。

ADD XMLSCHEMA DOCUMENT TO SAMPLE.CUSTOMER4 ADD 'company4.xsd'
FROM '/work/company4.xsd';

最後に、登録したXMLスキーマを検証し使用可能状態とします。

COMPLETE XMLSCHEMA SAMPLE.CUSTOMER4;

XMLデータの挿入と妥当性検証

上記で定義したXMLスキーマを用いてXMLデータを妥当性検証し、以下のテーブルのXMLデータタイプ(XMLDATAカラム)に挿入する例を述べます。

CREATE TABLE T1 (ID INT NOT NULL PRIMARY KEY, XMLDATA XML NOT NULL);

SQL文でXMLデータの妥当性検証を行う場合、XMLVALIDATE関数を使用します。また、IMPORTコマンドでインポートするXMLデータの妥当性検証を行う場合、XMLVALIDATEオプションを使用します。

名前空間なしXMLスキーマ

リスト7のcustomer1.xmlは、customer1.xsdに適合するXMLデータの例です。名前空間を持たないXMLスキーマを参照する場合、名前空間 "http://www.w3.org/2001/XMLSchema-instance" のnoNamespaceSchemaLocation属性を使用します。

リスト 7. customer1.xml
<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:noNamespaceSchemaLocation="customer1.xsd"
  type="1">
    <name>cust1</name>
    <address>address1</address>
    <phone>11-2222-3333</phone>
    <email>cust1@sample.com</email>
</customer>

XMLVALIDATE関数にはいくつかのオプションがありますが、省略するとXMLデータに定義されたスキーマ・ロケーション(上記の場合、xsi:noNamespaceSchemaLocation属性の値)と同じスキーマ・ロケーションのXMLスキーマを使用して妥当性検証が行われます。

INSERT INTO T1(ID, XMLDATA) VALUES (1, 
XMLVALIDATE(XMLPARSE(DOCUMENT 
'<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:noNamespaceSchemaLocation="customer1.xsd"
  type="1">
    <name>cust1</name>
    <address>address1</address>
    <phone>11-2222-3333</phone>
    <email>cust1@sample.com</email>
</customer>'))
);

XMLVALIDATE関数に、"ACCORDING TO XMLSCHEMA ID リレーショナルID" を付加すると、XMLデータに定義されたスキーマ・ロケーションは無視され、このリレーショナルIDと同じリレーショナルIDのXMLスキーマを使用して妥当性検証が行われます。

上記XMLデータは、SAMPLE.CUSTOMER1に適合しますが、SAMPLE.CUSTOMER2で妥当性検証を行う場合、以下のSQL文を発行します。

INSERT INTO T1(ID, XMLDATA) VALUES (11, 
XMLVALIDATE(XMLPARSE(DOCUMENT 
'<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:noNamespaceSchemaLocation="customer1.xsd"
  type="1">
    <name>cust1</name>
    <address>address1</address>
    <phone>11-2222-3333</phone>
    <email>cust1@sample.com</email>
</customer>') ACCORDING TO XMLSCHEMA ID SAMPLE.CUSTOMER2)
);

結果として、このXMLデータはSAMPLE.CUSTOMER2には適合しないため、以下のエラーが返されます。

SQL16205N  XML 文書に含まれる要素の数が、内容モデル
"((name,address,phone,email,company-name),company-address)"
と突き合わせるには少なすぎます。  SQLSTATE=2200M

このように、リレーショナルIDを使用することにより、XMLデータを変更することなく、さまざまなXMLスキーマと妥当性検証することができます。

IMPORTコマンドの場合、XMLVALIDATEのオプションとしていくつかありますが、"XMLVALIDATE USING SCHEMALOCATION HINTS" を指定するとスキーマ・ロケーションが使用され、"XMLVALIDATE USING SCHEMA リレーショナルID" を指定するとリレーショナルIDが使用されます。 T1テーブルのIDカラムに111, XMLDATAカラムにcustomer1.xmlファイルに書かれたXMLデータを挿入するために以下のcustomer1.delファイルを作成します。

リスト 8. customer1.del
111, "<XDS FIL='customer1.xml'/>"

スキーマ・ロケーションを使用してXMLスキーマを特定してXMLデータの妥当性検証を行うためには、以下のIMPORTコマンドを発行します。

IMPORT FROM /work/customer1.del of del XML FROM /work
XMLVALIDATE USING SCHEMALOCATION HINTS INSERT INTO T1;

リレーショナルIDを使用してXMLスキーマを特定してXMLデータの妥当性検証を行うためには、以下のIMPORTコマンドを発行します。

IMPORT FROM /work/customer1.del of del XML FROM /work
XMLVALIDATE USING SCHEMA SAMPLE.CUSTOMER1 INSERT INTO T1;

名前空間なしXMLスキーマ (別の名前空間なしXMLスキーマを参照)

リスト9のcustomer2.xmlは、customer2.xsdに適合するXMLデータの例です。company-nameエレメントとcompany-addressエレメントは、includeで参照しているXMLスキーマcompany2.xsdに定義されているものです。

このXMLデータの妥当性検証も上記と同様なやり方で行うことができます。

リスト 9. customer2.xml
<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:noNamespaceSchemaLocation="customer2.xsd"
  type="2">
    <name>cust2</name>
    <address>address2</address>
    <phone>11-2222-3333</phone>
    <email>cust2@sample.com</email>
    <company-name>company1</company-name>
    <company-address>company-address1</company-address>
</customer>

名前空間ありXMLスキーマ

リスト10のcustomer3.xmlは、customer3.xsdに適合するXMLデータの例です。名前空間を持つXMLスキーマを参照する際は、名前空間 "http://www.w3.org/2001/XMLSchema-instance" のschemaLocation属性を使用し、その値として名前空間とスキーマ・ロケーションを指定します。

このXMLデータの妥当性検証も上記と同様なやり方で行うことができます。

リスト 10. customer3.xml
<?xml version="1.0"?>
<customer xmlns="http://www.sample.com/customer"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://www.sample.com/customer customer3.xsd"
  type="3">
    <name>cust3</name>
    <address>address3</address>
    <phone>11-2222-3333</phone>
    <email>cust3@sample.com</email>
</customer>

名前空間ありXMLスキーマ (異なる名前空間を持つXMLスキーマを参照)

リスト11のcustomer4.xmlは、customer4.xsdに適合するXMLデータの例です(すべてのエレメントの名前空間を明示的に記述しています)。複数の名前空間を持つ複数のXMLスキーマを参照できるように、名前空間 "http://www.w3.org/2001/XMLSchema-instance" のschemaLocation属性の値には、複数の名前空間とスキーマ・ロケーションのペアを指定することができます。

スキーマ・ロケーションを利用してXMLデータの妥当性検証を行う場合、最初のペアから順にXMLスキーマが特定されます。この例では、最初のペアとして、名前空間 "http://www.sample.com/customer" のスキーマ・ロケーションcustomer4.xsdが定義されています。このXMLスキーマの定義には、名前空間 "http://www.sample.com/company" がimportされていますので、その名前空間の定義も特定されます。次のペアとして、名前空間 "http://www.sample.com/company" のスキーマ・ロケーションが定義されていますが、既に特定されているため、この情報は無視されます。したがって、下記xsi:schemaLocation属性の値は、"http://www.sample.com/customer customer4.xsd"で十分です。

このXMLデータの妥当性検証も上記と同様なやり方で行うことができます。

リスト11. customer4.xml
<?xml version="1.0"?>
<cust:customer xmlns:cust="http://www.sample.com/customer"xmlns:com="http://www.sample.com/company"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.sample.com/customer customer4.xsd
                      http://www.sample.com/company company4.xsd"
  type="4">
    <cust:name>cust4</cust:name>
    <cust:address>address4</cust:address>
    <cust:phone>11-2222-3333</cust:phone>
    <cust:email>cust4@sample.com</cust:email>
    <com:name>company4</com:name>
    <com:address>company-address4</com:address>
</cust:customer>

XMLスキーマの登録情報とXMLデータの妥当性検証情報の参照

登録されたXMLスキーマのリレーショナルID、スキーマ・ロケーション、そのステータスを参照するには以下のSQL文を発行します。

SELECT OBJECTID,OBJECTSCHEMA,OBJECTNAME,SCHEMALOCATION,STATUS
   FROM SYSCAT.XSROBJECTS;

SYSCAT.XSROBJECTSテーブルのOBJECTIDは、XMLスキーマを登録する毎に新しいIDが割り振られます。STATUSはXMLスキーマの状態を示します(値Cは使用可能状態を意味します)。

上記で定義したXMLスキーマをすべて登録すると、以下の結果が得られます。

db2 => SELECT OBJECTID,
       SUBSTR(OBJECTSCHEMA,1,16) OBJECTSCHEMA,
       SUBSTR(OBJECTNAME,1,16) OBJECTNAME,
       SUBSTR(SCHEMALOCATION,1,16) SCHEMALOCATION,
       STATUS
   FROM SYSCAT.XSROBJECTS;

OBJECTID             OBJECTSCHEMA     OBJECTNAME       SCHEMALOCATION   STATUS
-------------------- ---------------- ---------------- ---------------- ------
    4785074604091136 SAMPLE           CUSTOMER1        customer1.xsd    C
    6755399441065728 SAMPLE           CUSTOMER2        customer2.xsd    C
    7881299347908352 SAMPLE           CUSTOMER3        customer3.xsd    C
    8725724278040320 SAMPLE           CUSTOMER4        customer4.xsd    C

  4 レコードが選択されました。

関連するテーブルとしてSYSCAT.XSROBJECTCOMPONENTSテーブルがあります。そのテーブルでは、それぞれのリレーショナルIDが保持する1つまたは複数のXMLスキーマと、XMLスキーマ・リポジトリー内部で管理しているスキーマ・ロケーションを保持しています。また、SYSCAT.XSROBJECTSテーブルと同じOBJECTIDカラムも保持しています。以下のSQL文で、OBJECTID、リレーショナルID、XMLスキーマ・リポジトリー内部で管理しているスキーマ・ロケーション、およびXMLスキーマの内容を得ることができます。

SELECT OBJECTID,OBJECTSCHEMA,OBJECTNAME,SCHEMALOCATION,
       XMLPARSE(DOCUMENT COMPONENT)
   FROM SYSCAT.XSROBJECTCOMPONENTS;

表示の都合上、上記のうちXMLスキーマの内容(COMPONENTカラム)以外の情報を取得すると、以下の結果が得られます。

db2 => SELECT OBJECTID,
       SUBSTR(OBJECTSCHEMA,1,16) OBJECTSCHEMA,
       SUBSTR(OBJECTNAME,1,16) OBJECTNAME,
       SUBSTR(SCHEMALOCATION,1,16) SCHEMALOCATION
   FROM SYSCAT.XSROBJECTCOMPONENTS;

OBJECTID             OBJECTSCHEMA     OBJECTNAME       SCHEMALOCATION
-------------------- ---------------- ---------------- ----------------
    4785074604091136 SAMPLE           CUSTOMER1        customer1.xsd
    6755399441065728 SAMPLE           CUSTOMER2        customer2.xsd
    6755399441065728 SAMPLE           CUSTOMER2        company2.xsd
    7881299347908352 SAMPLE           CUSTOMER3        customer3.xsd
    8725724278040320 SAMPLE           CUSTOMER4        customer4.xsd
    8725724278040320 SAMPLE           CUSTOMER4        company4.xsd

  6 レコードが選択されました。

XMLデータの妥当性検証に利用したXMLスキーマのOBJECTIDを取得するには、XMLXSROBJECTID関数を使用します。妥当性検証していないXMLデータにこの関数を使用した場合は、0が返ります。

SELECT XMLXSROBJECTID(XMLDATA) FROM T1;

単に妥当性検証を行ったかどうかを確認するには、IS VALIDATED を使用します。さらにオプションを指定して、特定のXMLスキーマを使用して妥当性検証を行ったXMLデータのみを取得することも可能です。

SELECT * FROM T1 WHERE XMLDATA IS VALIDATED

妥当性検証を行ったレコードに対しては'TRUE'、妥当性検証を行っていないレコードに対しては'FALSE'を返す場合、以下のようなSQL文を発行します。

SELECT ID,CASE WHEN XMLDATA IS VALIDATED THEN 'TRUE' ELSE 'FALSE' END
FROM T1;

XMLデータの更新と妥当性検証

XMLデータを更新する場合、以下の例のように、あるエレメントの値の変更など、参照するXMLスキーマに適合する更新であっても、XMLVALIDATE関数を指定しないと、以前に妥当性検証した情報は無効となります。

UPDATE T1
SET XMLDATA=XMLQUERY(
 'declare namespace cust="http://www.sample.com/customer";
  copy $new := $XMLDATA
  modify do replace value of $new/cust:customer/cust:address with "address4-2"
  return  $new')
WHERE ID = 4

以下のXMLデータの更新は新たにエレメントを1つ追加しており、参照しているXMLスキーマに適合しなくなりますが、妥当性検証を行っていないため、正常に更新されます。

UPDATE T1
SET XMLDATA=XMLQUERY(
 'declare namespace cust="http://www.sample.com/customer";
  copy $new := $XMLDATA
  modify do insert <cust:zip>1234567</cust:zip> into $new/cust:customer
  return  $new')
WHERE ID = 4

妥当性検証するためには、以下のようにXMLVALIDATE関数を指定します。

UPDATE T1
SET XMLDATA=XMLVALIDATE(XMLQUERY(
 'declare namespace cust="http://www.sample.com/customer";
  copy $new := $XMLDATA
  modify do insert <cust:zip>1234567</cust:zip> into $new/cust:customer
  return  $new'))
WHERE ID = 4

この例の場合、妥当性検証に失敗するためXMLデータの更新はされず、以下のエラーが返されます。

SQL16196N  XML 文書に正しく指定されていない要素 "cust:zip"
が含まれています。理由コード = "37"  SQLSTATE=2200M

まとめ

DB2は、XMLスキーマをW3Cで勧告されているスキーマ・ロケーションと、DB2が定義したリレーショナルIDで管理します。W3Cではスキーマ・ロケーションの使用は必須としておらず、各処理プログラムにその処理方法を一任しているため、DB2ではXMLデータに定義されているスキーマ・ロケーションからXMLスキーマを特定し妥当性検証を行うほかに、スキーマ・ロケーションは無視し、リレーショナルIDからXMLスキーマを特定する方法も提供しています。リレーショナルIDはそのユニーク性をDB2で保証しており、また、XMLデータ内に定義されているスキーマ・ロケーションを変更することなく、さまざまなXMLスキーマと妥当性検証することができます。

W3Cの勧告に基づいてスキーマ・ロケーションを使用して妥当性検証を行うこともできますので、ユーザーの好みなどに応じて選択することができます。ただし、DB2はスキーマ・ロケーションのユニーク性を管理していないため、スキーマ・ロケーションを利用する場合、ユーザーがそのユニーク性を管理する必要があります。

どちらの方法を用いた場合でも、XMLデータが妥当性検証されたものか、どのXMLスキーマと妥当性検証されたものかを取得することができます。

また、XMLデータの更新時は、以前の妥当性検証が無効となります。妥当性検証が必要であれば、XMLVALIDATE関数を用いてXMLデータを更新してください。

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Information Management
ArticleID=444409
ArticleTitle=DB2 によるXMLスキーマの管理とXML データの妥当性検証
publish-date=11192009