- Java核心技术·卷Ⅱ:高级特性(原书第10版)
- (美)凯S.霍斯特曼
- 694字
- 2024-12-20 22:36:03
3.3.2 XML Schema
因为XML Schema比起DTD语法要复杂许多,所以我们只涉及其基本知识。更多信息请参考http://www.w3.org/TR/xmlschema-0上的指南。
如果要在文档中引用Schema文件,需要在根元素中添加属性,例如:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/139-i.jpg?sign=1739357942-3QLCWW3IOT6PrzdUWCsLObNB9xkriaj7-0-f5a3c712d20f25a3ea7f803c55f02093)
这个声明说明Schema文件config.xsd会被用来验证该文档。如果使用命名空间,语法就更加复杂了。详情请参见XML Schema指南(前缀xsi是一个命名空间别名(namespace alias),请查看第3.5节以了解更多信息)。
Schema为每个元素都定义了类型。类型可以是简单类型,即有格式限制的字符串,或者是复杂类型。一些简单类型已经被内建到了XML Schema内,包括:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/140-i.jpg?sign=1739357942-57EHkCJtTmO3qAFf8s36KJpUqln5mNqz-0-66a0e97d057a58f3fe7c7cddae96d479)
注意:我们用前缀xsd:来表示XSL Schema定义的命名空间。一些作者代之以xs:。
可以定义自己的简单类型。例如,下面是一个枚举类型:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/140-2-i.jpg?sign=1739357942-5pLw1KGfWNrRZJnHYavLGp9A9FCAm4n1-0-ce57aa432b73310800801956269c5510)
当定义元素时,要指定它的类型:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/140-3-i.jpg?sign=1739357942-XD4ZdTdmxK5UazRzLYEeSJm0jvLZy9RC-0-52a9844a1ece6402bbd9e2eca19fe54d)
类型约束了元素的内容。例如,下面的元素将被验证为具有正确格式:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/140-4-i.jpg?sign=1739357942-YJEWqEes0p2yRO61MCuxVn11k6TsIsYK-0-0832dc67ded6c976877006c18daa40a5)
但是,下面的元素会被解析器拒绝:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/140-5-i.jpg?sign=1739357942-CKD3LUTxdYva3Y8sdKi3E794upcAPWCn-0-448542434a2d80033e11771acbf2304f)
FontType是name、size和style元素的序列。在这个类型定义中,我们使用了ref属性来引用在Schema中位于别处的定义。也可以嵌套定义,像这样:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/140-6-i.jpg?sign=1739357942-eFbZWruDAMSO0E1CMwSjMpTJWM7lrziJ-0-5e7d699d8f5a19f24ea57ad5f8f099ff)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/141-i.jpg?sign=1739357942-yLddhKz4miczKO3GR4XNMAGELFPtwTiw-0-a8b6e04c23e75e25c23b179f706f2985)
请注意style元素的匿名类型定义。
xsd:sequence结构和DTD中的连接符号等价,而xsd:choice结构和|操作符等价,例如:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/141-2-i.jpg?sign=1739357942-8D625uSoBFcmDDQxULQrGlJRDu0bJaiB-0-a3175a68a06f011f60f017bb45508fe2)
这和DTD中的类型email|phone类型是等价的。
如果要允许重复元素,可以使用minoccurs和maxoccurs属性,例如,与DTD类型item*等价的形式如下:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/141-3-i.jpg?sign=1739357942-piAIy5H4DYy3CdTnMW7x9SDy0lWS3Z2P-0-13dedaec6c8a53e19da4d9c6265a123f)
如果要指定属性,可以把xsd:attribute元素添加到complexType定义中去:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/141-4-i.jpg?sign=1739357942-PP0NEyAo3j3vX2YzXkkAv0byuVhZiFmK-0-d1ca5b41c1dc47ff2cd5636c414466a0)
这与下面的DTD语句等价:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/141-5-i.jpg?sign=1739357942-Dwjq5ljZgyvWmTwNRKB19cKr8SvuywmN-0-8a7b6bd00ee2715a3e584a4d922e5354)
可以把Schema的元素和类型定义封装在xsd:schema元素中:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/141-6-i.jpg?sign=1739357942-FsnP9n5urOkRS9ZYdAA14XVCeARlDtFC-0-158c8ad662230db27004b6ea0b0fe75a)
解析带有Schema的XML文件和解析带有DTD的文件相似,但有3点差别:
1)必须打开对命名空间的支持,即使在XML文件里你可能不会用到它。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/141-7-i.jpg?sign=1739357942-xCRPKygeGS0XKHTMw1ae1shPpqUwY05w-0-24508dc1f53acad15ffd4bd6e72586e1)
2)必须通过如下的“魔咒”来准备好处理Schema的工厂。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/141-8-i.jpg?sign=1739357942-5qvxyI4tVOXLTKtXQLEwOYRZbnj3dQ2o-0-f40f396604e1398562cf5d43070ced23)
3)解析器不会丢弃元素中的空白字符,这确实很令人恼火,关于这是否是一个bug,人们看法不一。有一种变通方法,请参看程序清单3-4中的代码。