跳转到内容

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 中验证的文档

华夏公益教科书