跳轉到內容

XQuery/文件驗證

來自 Wikibooks,開放世界的開放書籍

您希望使用 XML 模式驗證文件。

注意:驗證是一個非常複雜的話題。eXist 帶有預設設定,這些設定可能會阻止新增與名稱空間關聯的檔案,一旦模式儲存在登錄檔中。請注意這些已記錄在此處的因素。

eXist 支援一個驗證模組,該模組包含一個validate()函式,用於根據語法檔案(如 XML 模式)驗證 XML 檔案。

validation:validate($input-doc as item(), $schema-uri as xs:anyURI) as xs:boolean

其中:$input-doc 是您要驗證的文件,$schema-uri 是要用於驗證文件的 XML 模式的 URI。請注意,這必須是 xs:anyURI 型別。

此函式返回一個 true/false 的單一值,如果文件根據 XML 模式有效,則為 true。

程式碼示例

[編輯 | 編輯原始碼]
xquery version "1.0";

let $doc :=
<root>
   <element>test</element>
</root>

let $schema := '/db/test/validate/schema.xsd'

(: you must run this every time the XML Schema file changes! :)
let $clear := validation:clear-grammar-cache()

let $result :=
if (validation:validate($doc, $schema))
  then "PASS"
  else "FAIL"
  
return
<results>
   {$result}
</results>

XML 模式示例

[編輯 | 編輯原始碼]

這是一個用於驗證非常小的 XML 檔案的 XML 模式示例。在 eXist 1.3 中,僅支援具有名稱空間的 XML 檔案。

<xs:schema 
   xmlns="http://example.com" 
   xmlns:xs="http://www.w3.org/2001/XMLSchema" 
   targetNamespace="http://example.com" 
   elementFormDefault="qualified">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="my-data"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

關於此 XML 模式,有兩個要點需要注意。

targetNamespace="http://example.com" 屬性表示此 XML 模式針對 http://example.com 名稱空間。


elementFormDefault="qualified" 屬性表示當 XML 解析器讀取檔案的根時,應使用目標名稱空間。

如果沒有這兩個屬性,驗證將無法工作。

待驗證的 XML 檔案示例

[編輯 | 編輯原始碼]
<root xmlns="http://example.com">
    <my-data>test</my-data>
</root>

獲取錯誤訊息

[編輯 | 編輯原始碼]

validate() 函式僅返回簡單的布林 true/false 值。如果您的 XML 檔案中存在錯誤,則此函式在查詢錯誤方面不是很有用。為了幫助此過程,還有一個名為validate-report()的函式。它具有相同的引數

validation:validate-report($input-doc, $schema-uri)

結果可以修改為以下內容

let $result :=
 if ( validation:validate($input-doc, $schema-uri) )
   then "The XML File is Valid"
   else (
      "The XML File is Not Valid",
      validation:validate-report($input-doc, $schema-uri)
   )

參考文獻

[編輯 | 編輯原始碼]

eXist 中驗證的文件

華夏公益教科書