|
珞珈山水BBS →
武汉大学 →
计算机学院 →
单文区文章阅读
|
| 单文区文章阅读 [返回] |
|---|
|
发信人: bewithu (36.2℃沸点o0 和你在一起), 信区: C.S 标 题: XML详解----Schema 发信站: BBS 珞珈山水站 (Tue May 8 13:42:16 2007) 转自byhh.net, Schema初级教程,更加详细的内容请Google查询 有人会问,DTD和Schema都是对XML文档的一种约束,为什么不就选其中之一,而又有Sche ma呢。因为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,用元素定义实例文档中的元素,如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> 对属性的设置,基本上和元素的差不多。比如: <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属性是默认值。 -- ※ 来源:·珞珈山水BBS站 http://bbs.whu.edu.cn·[FROM: 222.20.236.*] |
| [返回单文区目录] |
|
|