Java开发教程:用Schema验证xml

/  2010-03-07 16:56:09  来源:mxjava.com 

Webjx网页教学提示:在过去我们用 DTD 来定义 XML 文档的和法性,而现在可以利用 XML Schema (XML Schema Definition,XSD)来替代 DTD。同 DTD 相同,XML Schema 描述了 XML 文档的结构,既然如此,那么我们为什么要选择 XML Schema 而不是 DTD 呢?

在过去我们用 DTD 来定义 XML 文档的和法性,而现在可以利用 XML Schema (XML Schema Definition,XSD)来替代 DTD。同 DTD 相同,XML Schema 描述了 XML 文档的结构,既然如此,那么我们为什么要选择 XML Schema 而不是 DTD 呢?

1、XML Schema 可针对未来的需求进行扩展,DTD 不易扩展。
2、XML Schema 更完善,功能更强大。
3、XML Schema 基于 XML 编写,一个 XML Schema 也是一个 XML 文件。DTD 不遵循 XML 语法,这表示你不得不多去学习另外一门语言。
4、XML Schema 支持数据类型,内置多种数据类型。DTD 数据类型有限。
5、XML Schema 支持命名空间,DTD 不支持命名空间。
6、XML Schema 在 2001年5月2日成为 W3C 标准。

最近正在将 Grapevine 升级至第2代版本 ,将全 xml 配置转为 Annotation + xml 的方式。如此一来,将大大简化 xml 文件的配置,提高生产效率。我们来看看 Grapevine2 中最基础的 xml 配置是如何利用 XML Schema 进行验证的。

<?xml version="1.0" encoding="UTF-8"?> 
<GRAPEVINE> 
    <GRAPE class=test.TestAbc id=resourceTestAbc /> 
    <GRAPE class=java.lang.String id=stringName value="ok..." /> 
</GRAPEVINE> 

这是一个再简单不过的 xml 文件,仅仅包含了 grapevine 根元素和 grape 子元素。grape 子元素中包含了 id、class、value 三个属性。其中 id 和 class 为必选属性, value 为可选。再来看看 xsd (XML Schema)文件内容。

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<XS:SCHEMA xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <XS:ELEMENT name="grapevine"> 
        <XS:COMPLEXTYPE> 
            <XS:SEQUENCE> 
                <XS:ELEMENT name="grape" minOccurs="0" maxOccurs="unbounded"> 
                    <XS:COMPLEXTYPE> 
                        <XS:ATTRIBUTE name="id" use="required" type="xs:string" /> 
                        <XS:ATTRIBUTE name="class" use="required" type="xs:string" /> 
                        <XS:ATTRIBUTE name="value" type="xs:string" /> 
                    </XS:COMPLEXTYPE> 
                </XS:ELEMENT> 
            </XS:SEQUENCE> 
        </XS:COMPLEXTYPE> 
        <XS:UNIQUE name="idUnique"> 
            <XS:SELECTOR xpath=".//grape" /> 
            <XS:FIELD xpath="@id" /> 
        </XS:UNIQUE> 
    </XS:ELEMENT> 
</XS:SCHEMA>

在上面的 schema 中,我们使用了标准的命名空间 (xs),与此命名空间相关联的 URI 是 Schema 的语言定义(Schema language definition),其标准值是 http://www.w3.org/2001/XMLSchema。

接下来我们定义了 grapevine 元素,该元素包含了 grape 元素,grape 用 xs:element 定义,并由 xs:sequence 包围。maxOccurs=”unbounded” 表示该元素出现次数没有限制。minOccurs=”0″ 表示该元素可以不出现。grape 元素的三个属性由 xs:attribute 定义,其中 type=”xs:string” 表示该属性的数据类型 ( XML Schema 拥有多种内建数据类型,如:xs:string、xs:integer、xs:boolean、xs:date 等)。use=”required” 表示该属性是必选的,若不定义表示该属性为可选的。

我们定义相同 id 的 grape 元素在 grapevine 中是唯一的,所以必须对 grape 的 id 属性进行唯一性验证。xs:unique 用来定义一个唯一性验证,你也可以用多个 xs:unique 对多个元素或属性进行验证。这里我们只针对 id 属性,所以命名为 idUnique 。xs:selector 用来定义其范围,xs:field 定义验证的值。也可以针对元素内容进行验证,如下:

<ID>resourceTestAbc</ID> 
<XS:UNIQUE name="idUnique"> 
<XS:SELECTOR xpath=".//grape" /> 
<XS:FIELD xpath="id" /> 
</XS:UNIQUE> 

resourceTestAbc

利用xsd文件校验xml文件的java代码:

try {  
    SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema")  
        .newSchema(new File("grapevine.xsd")).newValidator()  
            .validate(new StreamSource(xmlPath));  
} catch (Exception ex) {  
// 验证失败  

try {
    SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema")
        .newSchema(new File("grapevine.xsd")).newValidator()
            .validate(new StreamSource(xmlPath));
} catch (Exception ex) {
// 验证失败
}

Popularity: 47%

更多

推荐文章