【0】README
0.0)本文文字描述转自 core java volume 2 , 旨在理解 XML——XML Schema 的基础知识 ;(本文不涉及源代码, 很遗憾,以后会补充)
【1】XML Schema 相关
1.0)为什么引入XML Schema? 如果要指定文档结构,可以提供一个文档类型定义(DTD)或一个 XML Schema定义;DTD 或 schema 包含了用于解释文档应该如何构成的规则, 这些规则指定了每个元素的合法子元素和和属性; (干货——为什么引入XML Schema)
1.1)如果要在文档中引用 Schema 文件, 需要在 根元素中添加属性, 例如:
<?xml version="1.0"?>
<configuration xmlns:xsi="http://www.w2.org/2001.XMLSchema-instance" xsi:noNamespaceSchemaLocation="config.xsd">
</configuration>
- 这个声明是在说: Schema文件 config.xsd 会被用来验证文档;(而 前缀xsi 是一个命名空间别名——namespace alias); (干货——前缀xsi 是一个命名空间别名)
1.2)Schema使用命名空间定义了每个元素的类型。类型可以是简单类型,即有格式限制的字符串或复杂类型。 (干货——Schema使用命名空间定义了每个元素的类型。)
- 1.2.1)一些简单类型已经被内建到了 XML Schema 内,包括:
xsd : string
xsd : int
xsd : boolean
Attention)
- A1)我们用前置 xsd: 来表示XSL Schema定义的命名空间, 一些作者用 xs: 代替;
- A2)可以自定义自己的简单类型:
<xsd: simpleType name="StyleType">
<xsd: restriction base="xsd:string">
<xsd: enumeration value="PLAIN">
<xsd: enumeration value="BOLD">
<xsd: enumeration value="ITALIC">
<xsd: enumeration value="BOLD_ITALIC">
</xsd: restriction>
</xsd: simpleType>
- A2.1)当定义元素时,要指定它的类型:
<xsd: element name="name" type="xsd:string" />
<xsd: element name="size" type="xsd:int" />
<xsd: element name="style" type="StyleType" />
- A2.2)类型约束了元素的内容, 下面 的元素个数被验证为正确格式:
<size>10</size>
<style>PLAIN</style>
- A2.3)但是下面的元素会被解析器拒绝:
<size>default</size>
<style>SLANTED</style>
- A2.4)你可以把类型组合成复杂类型, 如:
<xsd:complexType name="FontType">
<xsd:sequence>
<xsd:element ref="name"/>
<xsd:element ref="size"/>
<xsd:element ref="style"/>
</xsd:sequence>
</xsd:complexType>
- A2.5)嵌套定义:在上面的类型定义中, 我们用ref 属性来引用在 Schema 中位于别处的定义。也可以嵌套定义, 如这样:
<xsd:complexType name="FontType">
<xsd:sequence>
<xsd: element name="name" type="xsd:string" />
<xsd: element name="size" type="xsd:int" />
<xsd: element name="style" type="StyleType" />
<xsd: simpleType> // 而不是<xsd: simpleType name="StyleType">, 请注意这叫匿名定义;
<xsd: restriction base="xsd:string">
<xsd: enumeration value="PLAIN">
<xsd: enumeration value="BOLD">
<xsd: enumeration value="ITALIC">
<xsd: enumeration value="BOLD_ITALIC">
</xsd: restriction>
</xsd: simpleType>
</xsd:sequence>
</xsd:complexType>
- A2.6)xsd: choice 和 | 操作符等价, 如: (干货——xsd:choice 和 | 操作符等价)
<xsd:complexType name="contactinfo">
<xsd:choice>
<xsd:element ref="email">
<xsd:element ref="phone">
</xsd:choice>
</xsd:complexType>
同:
<xsd:complexType name="contactinfo">
<xsd:element ref="email | phone">
</xsd:complexType>
A2.7)如果允许使用重复元素,使用 minoccurs 和 maxoccurs 属性:
A2.7.1)看个荔枝:与 DTD类型 item* 的等价形式如下:
<xsd:element name="item" type="..." minoccurs="0" maxoccurs="unbounded">
<xsd:element name=szie>
<xsd:complexType>
...
<xsd:attribute name="unit" type="xsd:string" use = "optional" default="cm"/>
</xsd:complexType>
</xsd:element>
A2.8)这是DTD 声明等价 的形式:
<!ATTLIST size unit CDATA #IMPLIED "cm">
A2.9) 可以把 Schema 的元素和类型定义封装在 xsd:schema 元素中:
<xsd: schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
</xsd: schema>
A2.10)解析带有 Schema 的XML 文件和解析带有 DTD 的文件相似, 但有3点差别(Difference): (干货—— Schema 的XML 文件和带有 DTD 的XML文件的差别有3)
- D1)必须打开对命名空间的支持,即使在 XML 文件里你不使用它;
factory.setNamespaceAware(true); - D2)必须通过如下 “魔咒”来准备好处理 Schema 的工厂:
final String JAXP_SCHEMA_LANGUAGE="http://java.sun.com/xml/jaxp/properties/schemaLanguage";
final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
factory.setAttribute(JAXP_SCHEMA_LANGUAGE,W3C_XML_SCHEMA ); - D3) 解析器不会丢弃元素中的空白字符, 这是个很老火的问题;
- D1)必须打开对命名空间的支持,即使在 XML 文件里你不使用它;