一 DTD简单介绍
不解释,参看w3cschool
xml代码:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT classroom (claName,grade,students)>
<!ATTLIST classroom id ID #REQUIRED>
<!ELEMENT claName (#PCDATA)>
<!ELEMENT grade (#PCDATA)>
<!ELEMENT students (student+)>
<!ELEMENT student (id,stuName,age)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT stuName (#PCDATA)>
<!ELEMENT age (#PCDATA)>
xml代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE classroom SYSTEM "classroom.dtd">
<classroom id="c1">
<claName>10计算机应用技术</claName>
<grade>2010</grade>
<students>
<student>
<id>1</id>
<stuName>zhangsan</stuName>
<age>12</age>
</student>
<student>
<id>2</id>
<stuName>lisi</stuName>
<age>122</age>
</student>
</students>
</classroom>
二 schema入门
schema出现的目的是通过一个更加合理的方式来编写xml的限制文件(基于xml语法的方式),可以使用命名空间来支持多个名称相同的元素防止命名冲突,可以很好的完成对java或者所有对象的修饰并且提供了大量的数据类型。
2.1 命名空间
xml代码:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/01"
xmlns:tns="http://www.example.org/01"
elementFormDefault="qualified">
<element name="user">
<complexType>
<sequence>
<element name="id" type="int"/>
<element name="username" type="string"/>
<element name="born" type="date"/>
</sequence>
</complexType>
</element>
</schema>
xmlns=”http://www.w3.org/2001/XMLSchema” : schema的默认名称空间,不能修改,但是可以增加前缀,如果增加前缀之后就意味着所有的element等元素都需要增加前缀。
targetNamespace 自已这个文档的命名空间,可以方便其它xml或者schema文件引用
xmlns:tns 此处的名称和自己的名称空间的名称一致,但是增加了tns的前缀,此时如果要引用当前文件所创建的类型,需要加上tns前缀
在xml中引入schame
xml代码:
<?xml version="1.0" encoding="UTF-8"?>
<user xmlns="http://www.example.org/01"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/01">
<id>1</id>
<username>zhangsan</username>
<born>1989-12-22</born>
</user>
xmlns:xsi 创建了一个可以引入其它schema文件的命名空间
xsi:schemaLocation 引入其它命名空间, 如果要在eclipse中使用命名空间的引入,需要为xml增加xml的cataloge
如果不希望通过命名空间来引入schema,可以使用文件路径来引入
xml代码:
xsi:noNamespaceSchemaLocation="01.xsd"
2.2 元素和属性
sequence : 元素必须按顺序出现
choice : 多个元素中选择一个
all: 元素的出现顺序可以为任意,但相同的元素只能有一个
注意,属性的定义在sequence之后。
xml代码:
<element name="books">
<complexType>
<!-- maxOccurs表示最大出现次数 -->
<sequence maxOccurs="unbounded">
<element name="book">
<complexType>
<sequence minOccurs="1" maxOccurs="unbounded">
<element name="title" type="string" />
<element name="content" type="string" />
<choice>
<element name="author" type="string" />
<element name="authors">
<complexType>
<all><!-- 每个元素只能出现一次 -->
<element name="author" type="string"/>
</all>
</complexType>
</element>
</choice>
</sequence>
<attribute name="id" type="int" use="required"/>
</complexType>
</element>
</sequence>
</complexType>
</element>
2.3 相关约束
三 深入schema
3.1 数据模型的创建
通常一个类对一个schame文件,通过包含引用,需保证在同一个命名空间内
3.2 相关的设计方案
3.2.1 Russian Doll
只有一个根元素,通过嵌套的方式完成编写
优点:结构清晰,根元素只有一个
缺点:元素无法重用
3.2.2 Salami Slice
优点:能够进行最大化重用
缺点:根元素不清晰
xml代码:
<element name="book" type="tns:bookType"></element>
<element name="id" type="int"/>
<element name="title" type="string"/>
<element name="content" type="string"/>
<complexType name="bookType">
<sequence>
<element ref="tns:id"/>
<element ref="tns:title"/>
<element ref="tns:content"/>
</sequence>
</complexType>
3.2.3 Venetian Blind
一个根结点,通过simpleType完成重用。
xml代码:
<element name="person" type="tns:personType"/>
<complexType name="personType">
<sequence>
<element name="name" type="string"/>
<element name="age" type="tns:ageType"/>
<element name="email" type="tns:emailType"/>
</sequence>
<attribute name="sex" type="tns:sexType"/>
</complexType>
<simpleType name="emailType">
<restriction base="string">
<pattern value="(\w+\.*)*\w+@\w+\.[A-Za-z]{2,6}"/>
<minLength value="6"/>
<maxLength value="255"/>
</restriction>
</simpleType>
<simpleType name="ageType">
<restriction base="int">
<minInclusive value="1"/>
<maxExclusive value="150"/>
</restriction>
</simpleType>
<simpleType name="sexType">
<restriction base="string">
<enumeration value="男"/>
<enumeration value="女"/>
</restriction>
</simpleType>
3.3 shema与java的转换
使用xjc可以完成schema到java的转换