新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> DTD, XML Schema(XMLS), RELAX NG
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DTD/XML Schema 』 → XML详解----Schema(精)[原创] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 247662 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: XML详解----Schema(精)[原创] 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     xiaoxuanfeng 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:4
      积分:95
      门派:XML.ORG.CN
      注册:2005/10/28

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给xiaoxuanfeng发送一个短消息 把xiaoxuanfeng加入好友 查看xiaoxuanfeng的个人资料 搜索xiaoxuanfeng在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看xiaoxuanfeng的博客楼主
    发贴心情 XML详解----Schema(精)[原创]

    有人会问,DTD和Schema都是对XML文档的一种约束,为什么不就选其中之一,而又有Schema呢。因为DTD安全度太低了,也就是说它的约束定义能力不足,无法对XML实例文档做出更细致的语义限制。其实细心的人会发现,在DTD中,只有一个数据类型,就是PCDATA(用在元素中)和CDATA(用在属性中),在里面写日期也行,数字还行,字符更是没问题。而Schema正是针对这些DTD的缺点而设计的,Schema是完全使用XML作为描述手段,具有很强的描述能力,扩展能力和处理维护能力等。下面让我们看一个简单的例子吧:
    hello.xml
    -------------------
    <?xml version="1.0"?>
    <greeting>Hello World!!</greeting>

    说明:
    一个根元素:greeting;且这个元素不含属性,无子元素,内容是字符串。

    hello.xsd
    ----------
    <?xml version="1.0"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="greeting" type="xsd:string"/>
    </xsd:schema>
    说明:
    XML Schema文档后缀名是.xsd,完全符合XML语法,根元素是schema,命名空间xmlns:xsd="http://www.w3.org/2001/XMLSchema,用元素<element>定义实例文档中的元素,如greeting。xsd:string就是定义的数据类型了,其中的数据类型有很多,比如:int,double,dateTime,Boolean,long,integer,float,等,总之Java等语言里有的数据类型它都有,但要以“xsd:”开头。
    让我们再看一个里面有子无素的例子:
    customer.xml
    -----------
    <customer>
    <name>teiki</name>
    <address>No.237, Road Waitan, Shanghai</address>
    </customer>
    则可以写出以下的XML Schema文档:
    customer.xsd
    ----------------
    1: <?xml version="1.0"?>
    2: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3: <xsd:element name="customer">
    4: <xsd:complexType>
    5: <xsd:sequence>
    6: <xsd:element name="name" type="xsd:string"/>
    7: <xsd:element name="address" type="xsd:string" />
    8: </xsd:sequence>
    9: </xsd:complexType>
    10: </xsd:element>
    11: </xsd:schema>
    说明:
    实例文档customer.xml中,<customer>元素含有两个子元素,在Schema中凡是有两个以上的子元素,就认为是复杂类型的,所以我们在Schema文档中采用ComplexType来定义该元素。表示有多个XML子元素。
    sequence表示子元素依次出现的顺序。
    如果有多层子元素怎么办呢,同样的道理,有几层写几层,一直往下嵌就OK了,这里我要说的是另一种方法,结构看上去会清晰一些。
    address.xml
    ---------------
    <customer>
    <name>Teiki</name>
    <address>
    <!-- address追加一个地址子元素 -->
    <prefecture>Zhejiang</prefecture>
    <city>Hangzhou</city>
    <street>Xilu Road, No.121, 7F</street>
    </address>
    </customer>
    下面就是采用ref元素来编写的这个Schema文档:
    address2.xsd
    ----------------------
    1: <?xm l version="1.0"?>
    2: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3:
    4: <xsd:element name="customer">
    5: <xsd:complexType>
    6: <xsd:sequence>
    7: <xsd:element name="name" type="xsd:string"/>
    8: <xsd:element ref="address"/>
    9: </xsd:sequence>
    10: </xsd:complexType>
    11: </xsd:element>
    12:
    13: <xsd:element name="address">
    14: <xsd:complexType>
    15: <xsd:sequence>
    16: <xsd:element name="prefecture" type="xsd:string"/>
    17: <xsd:element name="city" type="xsd:string" />
    18: <xsd:element name="street" type="xsd:string" />
    19: </xsd:sequence>
    20: </xsd:complexType>
    21: </xsd:element>
    22:
    23: </xsd:schema>
    说明:
    如果按正常的写法,应该把13-21行的内容替换到每8行去,但这里使用ref元素可以直接将其指向另一个模块,使文档更加具有可读性。
    如果元素中包含属性怎么办呢?一样简单,只要在定义完子元素的后面再着定义属性就行了。定义属性用“attribute”,还是举个例子吧
    customer2.xml
    ---------------
    <customer id="001718">
    <name>Teiki</name>
    <address>No.237, Road Waitan, Shanghai</address>
    </customer>
    这个例子和上面的一个例子差不多,只是在元素customer中设了一个属性id。
    customer2.xsd
    ------------------
    1: <?xml version="1.0"?>
    2: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3:
    4: <xsd:element name="customer">
    5: <xsd:complexType>
    6: <xsd:sequence>
    7: <xsd:element name="name" type="xsd:string"/>
    8: <xsd:element name="address" type="xsd:string" />
    9: </xsd:sequence>
    10: <!-- 增加属性定义 -->
    11: <xsd:attribute name="id" type="xsd:string"/>
    12: </xsd:complexType>
    13: </xsd:element>
    14:
    15: </xsd:schema>
    说明:
    需要注意的一点是,属性和元素不是一家的,所以要把它放在sequence外面写,但它们都在customer的孩子,所以要写在complexType的里面。
    下面再看一个例子:
    order4-1.xsd
    ----------------------
    1:<?xml version="1.0"?>
    2:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3:
    4: <xsd:element name="order">
    5: <xsd:complexType>
    6: <xsd:sequence>
    7: <xsd:element ref="orderItem" maxOccurs="10"/>
    8: </xsd:sequence>
    9: </xsd:complexType>
    10: </xsd:element>
    11:
    12: <xsd:element name="orderItem">
    13: <xsd:complexType>
    14: <xsd:sequence>
    15: <xsd:choice>
    16: <xsd:element name="id" type="idType"/>
    17: <xsd:element name="name" type="xsd:string"/>
    18: </xsd:choice>
    19: <xsd:element name="quantity" type="quantityType"/>
    20: </xsd:sequence>
    21: </xsd:complexType>
    22: </xsd:element>
    23:
    24: <xsd:simpleType name="idType">
    25: <xsd:restriction base="xsd:string">
    26: <xsd:enumeration value="7-5058-3496-7"/>
    27: <xsd:enumeration value="7-5005-6450-3"/>
    28: <xsd:enumeration value="7-3020-6069-7"/>
    29: </xsd:restriction>
    30: </xsd:simpleType>
    31:
    32: <xsd:simpleType name="quantityType">
    33: <xsd:restriction base="xsd:integer">
    34: <xsd:minInclusive value="1"/>
    35: <xsd:maxInclusive value="10"/>
    36: </xsd:restriction>
    37: </xsd:simpleType>
    38:
    39:</xsd:schema>
    上面的例子中,maxOccurs代表:相同元素最多出现的次数,与些相反的是minOccurs代表:出现的最少次数。默认情况下两个都为“1”,如果把minOccurs设为“0”,表示该元素可有可无。choice代表:可选的元素,也就是在这里面写的元素只能选其中之一,不能全写。simpleType代表自定义数据类型,也就是name里的并不是真正的数据类型,而是根据自己的意愿定制的。restriction代表对某一数据类型做约束,也就是只能取其中范围之内符合要求的,比如第25-29行中,里面又有个元素enumeration代表枚举,也就是只能在枚举的那几个中选一个,而下在的36-36行,里面又有一对元素minInclusive和maxInclusive代表类型的取值范围,也就是只能取大于等于minInclusive并且小于等于maxInclusive的数。
    把这个Schema用在XML中是这样的:
    <?xml version="1.0" encoding="UTF-8"?>
    <order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:\ProgramCode\Year2\XML\practice\temp.xsd">
    <orderItem>
    <id>7-5005-6450-3</id>
    <quantity>3</quantity>
    </orderItem>
    <orderItem>
    <name>xyb</name>
    <quantity>3</quantity>
    </orderItem>
    <!-- 注意下面这个是错的,因为超出了规定的范围 -->
    <orderItem>
    <id>7-5005-6450-3</id>
    <quantity>13</quantity>
    </orderItem>
    <!? 从上面的注释到此,是错误的 -->
    </order>
    说明:
    红色的部分是导入Schema的命令,绿色的是Schema文件的路径,如果用XMLSPY写时,会自动加上。
    对属性的设置,基本上和元素的差不多。比如:
    <xsd:element name="orderItem">
    <xsd:complexType>
    <xsd:sequence></xsd:sequence>
    <xsd:attribute name="id" type="idType" use="required"/>
    <xsd:attribute name="quantity" type="xsd:integer" default="1"/>
    </xsd:complexType>
    <xsd:simpleType name="idType">
    <xsd:restriction base="xsd:string">
    <xsd:pattern value="\d{1}-\d{4}-\d{4}-\d{1}"/>
    </xsd:restriction>
    </xsd:simpleType>
    </xsd:element>
    这里我们讲id属性类型作为一种自定义数据类型idType。它的格式就是上面用到的也就是类似于“7-5005-6450-3”样的。
    而且,用attribute元素的use属性来定义是否是必须的属性。
    required是必须值,optional是可选值,prohibited是无属性值。default属性是默认值。
    {replyview}{/replyview}


       收藏   分享  
    顶(2)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/1 9:42:00
     
     fengzhiyi 帅哥哟,离线,有人找我吗?巨蟹座1979-7-6
      
      
      威望:4
      等级:大一(高数修炼中)
      文章:104
      积分:771
      门派:XML.ORG.CN
      注册:2005/2/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给fengzhiyi发送一个短消息 把fengzhiyi加入好友 查看fengzhiyi的个人资料 搜索fengzhiyi在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看fengzhiyi的博客2
    发贴心情 
    讲的很详细,举例典型简单,赞一个!!!希望以后多发这样的贴!!!

    ----------------------------------------------
    Don't walk in front of me, I won't follow you.
    Don't walk behind me,I won't guide you.
    Just walk beside me,then we can hand in hand together.

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/1 19:21:00
     
     chenhm66 美女呀,离线,快来找我吧!
      
      
      等级:大一(高数修炼中)
      文章:18
      积分:131
      门派:XML.ORG.CN
      注册:2005/10/31

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给chenhm66发送一个短消息 把chenhm66加入好友 查看chenhm66的个人资料 搜索chenhm66在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看chenhm66的博客3
    发贴心情 
    不错啊,
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/17 11:05:00
     
     su230501 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:56
      门派:XML.ORG.CN
      注册:2005/11/24

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给su230501发送一个短消息 把su230501加入好友 查看su230501的个人资料 搜索su230501在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看su230501的博客4
    发贴心情 
    不错,简单适用
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/24 11:58:00
     
     victorwish 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:89
      门派:XML.ORG.CN
      注册:2005/11/25

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给victorwish发送一个短消息 把victorwish加入好友 查看victorwish的个人资料 搜索victorwish在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看victorwish的博客5
    发贴心情 
    太感谢了。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/28 12:02:00
     
     littleguy 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:59
      门派:XML.ORG.CN
      注册:2005/10/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给littleguy发送一个短消息 把littleguy加入好友 查看littleguy的个人资料 搜索littleguy在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看littleguy的博客6
    发贴心情 
    good,thanks
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/29 17:19:00
     
     厦门乞丐 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:13
      积分:131
      门派:XML.ORG.CN
      注册:2005/11/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给厦门乞丐发送一个短消息 把厦门乞丐加入好友 查看厦门乞丐的个人资料 搜索厦门乞丐在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看厦门乞丐的博客7
    发贴心情 
    好东西,当然要顶啦。谢谢楼主
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/1 13:14:00
     
     lai_gb 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:78
      门派:XML.ORG.CN
      注册:2005/12/4

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lai_gb发送一个短消息 把lai_gb加入好友 查看lai_gb的个人资料 搜索lai_gb在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看lai_gb的博客8
    发贴心情 
    好好。谢谢。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/4 17:16:00
     
     bruclan 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:9
      积分:94
      门派:XML.ORG.CN
      注册:2005/11/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给bruclan发送一个短消息 把bruclan加入好友 查看bruclan的个人资料 搜索bruclan在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看bruclan的博客9
    发贴心情 
    写的很不错,留下了
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/4 17:56:00
     
     howcoolo 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:57
      门派:XML.ORG.CN
      注册:2005/4/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给howcoolo发送一个短消息 把howcoolo加入好友 查看howcoolo的个人资料 搜索howcoolo在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看howcoolo的博客10
    发贴心情 
    不错不错,感谢楼主分享那么好的东西
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/8 11:01:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DTD/XML Schema 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/27 14:34:49

    本主题贴数96,分页: [1] [2] [3] [4]... [10]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    207.031ms