WebService学习笔记(二) - XML的dtd和schema

一 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的转换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值