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 綱目定義包含非字串類型的簡式元素,則該元素內的空格可忽略。
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
REGISTER XMLSCHEMA http://posample.org/product.xsd FROM product.xsd \
AS myschema.product COMPLETE
CREATE TABLE MyProduct LIKE Product
<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 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))
<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
綱目定義 name
、 details
、 price
和 weight
元素周圍的空格,以及價格元素內的空格作為可忽略的空格,因此 XMLVALIDATE 會移除它。如果您需要確保只插入已驗證的文件至 XML 直欄,或只擷取已從 XML 直欄驗證的文件,請使用 VALIDATED 述詞。
若要在插入或更新文件之前測試是否已驗證 XML 文件,請在 XML 直欄上建立包含 VALIDATED 述詞的檢查限制。 若要僅從 XML 直欄擷取已驗證的文件,或僅擷取已插入但未驗證的那些文件,您可以在 WHERE 子句中使用 VALIDATED 述詞。 如果您需要檢查 XML 文件是否已根據特定 XML 綱目進行驗證,請將具有 VALIDATED 述詞的 XML 綱目包含在 TO XMLSCHEMA 子句中。
VALIDATED 述詞也可以用作觸發程式的一部分。 若要在 XML 直欄中插入或更新尚未驗證的 XML 文件之前觸發驗證,請建立包含 WHEN 子句中 XML 直欄上 VALIDATED 述詞的 BEFORE 觸發程式,以呼叫 XMLVALIDATE 函數。
SELECT Info FROM MyCustomer WHERE Info IS VALIDATED
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 錯誤。