XML 驗證

XML 驗證是判斷 XML 文件的結構、內容及資料類型是否有效的程序。 XML 驗證也會除去 XML 文件中的 可忽略的空格

驗證是選用的,但在資料完整性有問題時強烈建議使用,因為它可確保 XML 文件遵守其 XML 綱目所提供的規則,且其形式完整。

請注意,您只能根據 XML 綱目來驗證 XML 文件。 您無法根據 DTD 驗證 XML 文件。

若要驗證 XML 文件,請使用 XMLVALIDATE 函數。 您可以使用在 Db2® 資料庫中插入或更新 XML 文件的 SQL 陳述式來指定 XMLVALIDATE。 對於 XML 文件的自動驗證, XML 直欄上的之前觸發程式也可以呼叫 XMLVALIDATE 函數。 若要強制驗證 XML 文件,請建立核對限制。

您必須先在內建 XML 綱目儲存庫中登錄構成 XML 綱目的所有綱目文件,才能呼叫 XMLVALIDATE 函數。 XML 文件本身不需要位於資料庫中,您就可以使用 XMLVALIDATE 來驗證它。

XML 驗證和可忽略的空格

根據 XML 標準, 空格 是空格字元 (U+0020)、換行 (U+000D)、換行 (U+000A) 或文件中的標籤 (U+0009) ,以提高可讀性。 當其中任何字元顯示為字串的一部分時,它們不會被視為空格。

可忽略的空格 是可從 XML 文件中刪除的空格。 XML 綱目文件決定哪一個空格是可忽略的空格。 如果 XML 文件定義僅元素複式類型 (只包含其他元素的元素) ,則元素之間的空格可忽略。 如果 XML 綱目定義包含非字串類型的簡式元素,則該元素內的空格可忽略。

範例: 範例 product.xsd XML 綱目文件中的 description 元素定義如下:
<xs:element name="description" minOccurs="0" maxOccurs="unbounded">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0" />
      <xs:element name="details" type="xs:string" minOccurs="0" />
      <xs:element name="price" type="xs:decimal" minOccurs="0" />
      <xs:element name="weight" type="xs:string" minOccurs="0" />
 ...
 </xs:complexType>
</xs:element>
description 元素具有僅限元素的複式類型,因為它只包含其他元素。 因此, description 元素中元素之間的空格是可忽略的空格。 price 元素也可以包含可忽略的空格,因為它是包含非字串類型的簡式元素。

在 XMLVALIDATE 函數中,您可以明確指定要用於驗證的 XML 綱目文件。 如果您未指定 XML 綱目文件, Db2 資料庫伺服器會在輸入文件中尋找 xsi:schemaLocation 或 xsi:noNamespaceSchemaLocation 屬性,以識別 XML 綱目文件。 xsi:schemaLocation 或 xsi:noNamespaceSchemaLocation 屬性由「XML 綱目」規格定義,稱為 XML 綱目提示。 xsi:schemaLocation 屬性包含一或多對值,可協助尋找 XML 綱目文件。 每一個配對中的第一個值是名稱空間,第二個值是提示,指出在何處尋找名稱空間的 XML 綱目。 xsi:noNamespaceSchemaLocation 值只包含提示。 如果在 XMLVALIDATE 函數中指定 XML 綱目文件,它會置換 xsi:schemaLocation 或 xsi:noNamespaceSchemaLocation 屬性。

下列範例假設綱目 product 已登錄在 XML 綱目儲存庫 (XSR) 中。 您可以使用類似下列的 CLP 陳述式來完成登錄:
REGISTER XMLSCHEMA http://posample.org/product.xsd FROM product.xsd \
AS myschema.product 
COMPLETE XMLSCHEMA myschema.product
或者,因為 XML 綱目包含單一綱目文件,所以您可以使用單一陳述式來登錄 XML 綱目並完成登錄:
REGISTER XMLSCHEMA http://posample.org/product.xsd FROM product.xsd \
AS myschema.product COMPLETE
範例: 假設您建立表格 MyProduct 如下:
CREATE TABLE MyProduct LIKE Product
您想要使用動態 SQL 應用程式將下列文件插入 MyProduct 表格中的 XML 直欄 Info ,並且想要根據 XML 綱目文件 product.xsd來驗證 XML 資料,該文件位於與 MyProduct 表格相同的資料庫伺服器上的 XML 綱目儲存庫中。
<product xmlns="http://posample.org" pid=''110-100-01'' >
 <description>
 <name>Anvil</name>
 <details>Very heavy</details>
 <price>         9.99            </price>
 <weight>1 kg</weight>
 </description>
</product>'
在 INSERT 陳述式中, XMLVALIDATE 函數指定要用於驗證的 XML 綱目:

Insert into MyProduct 
 (pid, name, Price, PromoPrice, PromoStart, PromoEnd, description) 
 values ( '110-100-01','Anvil', 9.99, 7.99, '11-02-2004','12-02-2004', 
 XMLVALIDATE(? ACCORDING TO XMLSCHEMA ID myschema.product))
當您擷取儲存的資料時,可以看到 XMLVALIDATE 移除可忽略空格的位置。 擷取的資料是具有下列內容的單一行:
<product xmlns="http://posample.org" pid="110-100-01"><description><name>Anvil
</name><details>Very heavy</details><price>9.99</price><weight>1 kg</weight>
</description></product>
product 綱目定義 namedetailspriceweight 元素周圍的空格,以及價格元素內的空格作為可忽略的空格,因此 XMLVALIDATE 會移除它。

如果您需要確保只插入已驗證的文件至 XML 直欄,或只擷取已從 XML 直欄驗證的文件,請使用 VALIDATED 述詞。

若要在插入或更新文件之前測試是否已驗證 XML 文件,請在 XML 直欄上建立包含 VALIDATED 述詞的檢查限制。 若要僅從 XML 直欄擷取已驗證的文件,或僅擷取已插入但未驗證的那些文件,您可以在 WHERE 子句中使用 VALIDATED 述詞。 如果您需要檢查 XML 文件是否已根據特定 XML 綱目進行驗證,請將具有 VALIDATED 述詞的 XML 綱目包含在 TO XMLSCHEMA 子句中。

VALIDATED 述詞也可以用作觸發程式的一部分。 若要在 XML 直欄中插入或更新尚未驗證的 XML 文件之前觸發驗證,請建立包含 WHEN 子句中 XML 直欄上 VALIDATED 述詞的 BEFORE 觸發程式,以呼叫 XMLVALIDATE 函數。

範例: 假設您只想從 MyCustomer 表格的「資訊」直欄中擷取已驗證的 XML 文件。 執行如下的 SELECT 陳述式:
SELECT Info FROM MyCustomer WHERE Info IS VALIDATED
範例: 假設您只想要將已驗證的 XML 文件插入 MyCustomer 表格的「資訊」直欄中。 您可以定義檢查限制,以施行此條件。 以下列方式變更 MyCustomer 表格:
ALTER TABLE MyCustomer ADD CONSTRAINT CK_VALIDATED CHECK (Info IS VALIDATED)
不過,發出此陳述式會使在前一個範例中使用 VALIDATED 述詞變得不必要,因為只有有效的文件才會順利插入或更新在表格中。
範例: 假設您想要向客戶綱目驗證下列文件,但不想要將它儲存在資料庫中。
<customerinfo xml:space="default" 
  xmlns="http://posample.org" 
  Cid='1011'>
  <name>Kathy Smith</name>
  <addr country='Canada'>
  <street>25 Rosewood</street>
  <city>Toronto</city>
  <prov-state>Ontario</prov-state>
  <pcode-zip>M6W 1E6</pcode-zip>
  </addr>
  <phone type='work'>416-555-6676</phone>
</customerinfo>
假設您已將文件指派給應用程式變數。 您可以使用如下的 VALUES 陳述式來執行驗證:
VALUES XMLVALIDATE(? according to xmlschema id myschema.customer)
根據 XML 綱目,此文件有效,因此 VALUES 陳述式會傳回包含文件的結果表格。 如果文件無效, VALUES 會傳回 SQL 錯誤。