根据 XML 模式验证 XML 文档
作者 Deepak Vohra
学习的三种方法包括:SAX 分析器、DOM 分析器和 XSD 校验器
越来越多地采用 XML 文档作为数据交换的格式。如果 XML 文档不是为了被不同的开发人员/用户所接受的话,则 XML 文档应该符合标准的结构。
XML 模式是 XML 文档结构基于 XML 的表示。通过其对数据类型和命名空间的支持,XML 模式具有为 XML 元素和属性提供标准结构的潜力。
但是,要检查某个 XML 文档是否符合某种 XML 模式,则必须根据该 XML 模式验证该文档。本教程解释了执行该验证的过程,过程中使用了那些用于 XML 的简单 API (SAX) 和文档对象模型 (DOM) 的分析器以及 XML 模式设计 (XSD) 校验器。表 1 比较了这些组件各自的不同用途。在每种情况下,我们使用 Oracle XML 开发人员工具包 (XDK) 10g Beta 来执行验证。
SAXParser | DOMParser | XSDValidator |
用于在需要进行分析时验证 XML 文档 | 用于在 XML 文档需要进行分析并生成 XML 文档的 DOM 结构时进行验证 | 用于在不需要进行分析时验证 XML 文档 |
准备安装
要利用 Oracle XDK 验证 XML 文档,则在 Java CLASSPATH 中需要有分析器类。首先,将 xdk_nt_10_1_0_1_0A_beta.zip 文件解压缩到安装目录中。将 <Oracle_XDK>/lib/xmlparserv2.jar, <Oracle_XDK>/lib/xml.jar , 和 <Oracle_XDK>/lib/xschema.jar 添加到 Java CLASSPATH,其中 <Oracle_XDK> 是安装 Oracle XDK 的目录。
要验证的文档
在验证 XML 文档前,必须指定 XML 模式的位置。
XML 模式的位置可以利用带有命名空间的 XML 模式的 xsi:schemaLocation 属性以及不带命名空间的 XML 模式的 xsi:noNamespaceSchemaLocation 属性来指定,它们位于根/顶级元素中或 XML 文档的任何其他元素中。在此情形中,将使用 XML 文档示例 XmlDocumentUrl,它包含一个 Oracle Magazine 目录。
如果模式位置设置在 XML 文档中,则 <catalog> 元素定义为
<catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file://c:/Schemas/OracleCatalog.xsd" ...>
示例 XML 文档在列表 1中列出。
验证 XML 模式
我在前面曾解释过,XML 模式(在我们的示例中是 SchemaUrl)定义 XML 文档的结构。XML 模式中的元素声明可以指定 XML 文档中元素的命名空间。命名空间利用标注 xmlns:prefix= 来定义。prefix 是命名空间的前缀;默认的命名空间利用 xmlns= 来指定。我们的示例模式文档 OracleCatalog.xsd 中的 xs:schema 元素利用命名空间的声明而指定为
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
OracleCatalog.xsd XML 模式文档中的元素(参见列表 2)位于 http://www.w3.org/2001/XMLSchema 的 XML 模式命名空间中。
利用 SAXParser 验证 XML 文档
接下来,我们需要进行验证。首先,导入 SAXParser 类:
import oracle.xml.parser.v2.SAXParser;
创建 SAXParser:
SAXParser saxParser=new SAXParser();
设置报告合法性错误的验证模式:
saxParser.setValidationMode(XMLParser.SCHEMA_VALIDATION);
现在设置用于验证的 XML 模式:
saxParser.setXMLSchema(SchemaUrl);
利用 SAXParser 分析器创建并注册 ErrorHandler。ErrorHandler 类是 Validator 类。
Validator handler=new Validator(); saxParser.setErrorHandler(handler);
分析要利用 XML 模式进行验证的 XML 文档。
saxParser.parse(XmlDocumentUrl);
任何由分析器产生的错误都利用 ErrorHandler 进行注册,并可以从 ErrorHandler 检索这些错误。
示例程序 XDKValidator.java 用于利用 OracleCatalog.xsd 和 SAXParser API 来验证 OracleCatalog.xml,如列表 3 所示。
利用 DOMParser 进行验证
现在,让我们利用 DOMParser 来验证我们的 XML 文档。首先,导入 DOMParser 类:
import oracle.xml.parser.v2.DOMParser;
创建 DOMParser:
DOMParser domParser=new DOMParser();
设置报告合法性错误的验证模式:
domParser.setValidationMode(XMLParser.SCHEMA_VALIDATION);
设置用于验证的 XML 模式:
domParser.setXMLSchema(SchemaUrl);
利用 DOMParser 分析器创建并注册 ErrorHandler。ErrorHandler 类是 Validator 类:
Validator handler=new Validator(); DOMParser.setErrorHandler(handler);
分析要利用 XML 模式进行验证的 XML 文档:
domParser.parse(XmlDocumentUrl);
任何由分析器产生的错误都利用 ErrorHandler 进行注册,并可以从 ErrorHandler 检索这些错误。此处使用的示例程序 DOMValidator.java 在列表 4 中列出。
利用 XSDValidator 进行验证
导入 XSDValidator 类:
import oracle.xml.schemavalidator.XSDValidator;
创建 XSDValidator:
XSDValidator xsdValidator=new XSDValidator();
指定用于验证 XML 文档的 XML 模式:
XSDBuilder builder = new XSDBuilder(); URL url = new URL(schemaUrl); XMLSchema schemadoc = (XMLSchema)builder.build(url); xsdValidator.setSchema(schemadoc);
利用 XSDValidator 校验器创建并注册 ErrorHandler。ErrorHandler 类是 Validator 类:
Validator handler=new Validator(); XMLError xmlError=new XMLError(); xmlError.setErrorHandler(handler); xsdValidator.setError(xmlError);
分析您要利用 XML 模式进行验证的 XML 文档:
xsdValidator.validate(new URL(XMLDocumentUrl));
如前文所述,任何由分析器生成的错误利用 ErrorHandler 进行注册,并可以从该处检索这些错误。
此处使用的示例程序 SchemaValidator.java 在列表 5 中列出。
验证完成
您刚刚学习了根据 XML 模式验证 XML 文档的三种不同方法。其中一种应该能够满足您的需要。
来源:http://www.oracle.com/technology/global/cn/pub/articles/vohra_xmlschema.html