Webservice-DTD和Schema(四)

写SOAP之前,写点XML的东西,为Soap打下一个比较好的基础。XML中主要讲DTD、Schema以及对XML的解析与XML与Java对象的关系等,DTD和Schema都不陌生,就蜻蜓点水,一带而过,XMl的解析在下篇中写。

关于dtd作用好处不用在此多言,它大有被schema替代的趋势,下面举例说明。首先来认识一下的DTD,如果我们想要如下格式的xml文档,dtd应该怎么写呢?

 

[html][/html] view plaincopy

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <!DOCTYPE persons SYSTEM “persons.dtd”>
  3. <persons>
  4.     <person id=”_1″>
  5.         <sex/>
  6.         <name/>
  7.         <age/>
  8.         <messages>
  9.             <message>
  10.                 <title/>
  11.                 <content/>
  12.             </message>
  13.         </messages>
  14.     </person>
  15.     <person id=”_2″>
  16.         <sex></sex>
  17.         <name></name>
  18.         <age></age>
  19.         <messages>
  20.             <message>
  21.                 <title></title>
  22.                 <content></content>
  23.             </message>
  24.         </messages>
  25.     </person>
  26. </persons>

 

来看为上面xml所写的dtd:

 

[html][/html] view plaincopy

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <!ELEMENT persons (person+)>
  3. <!ELEMENT person (sex,name,age,messages+)>
  4. <!ATTLIST person id ID #REQUIRED>
  5. <!ELEMENT sex (#PCDATA)>
  6. <!ELEMENT name (#PCDATA)>
  7. <!ELEMENT age (#PCDATA)>
  8. <!ELEMENT messages (message+)>
  9. <!ELEMENT message (title,content)>
  10. <!ELEMENT title (#PCDATA)>
  11. <!ELEMENT content (#PCDATA)>

 

阅读上面的dtd,persons为根节点,里面包含person节点,+为常用控制符,?表示0次或者1次,+表示1此或者多次,默认表示1次,这个不需要记忆,查文档即可,person包括sex等节点,为每一个节点定义类型,<!ATTLIST>是给person定义属性的,ID为类型,#REQUIRED表示该属性必须,不能不写。

dtd没多少内容,会写会用基本就可以了。关于schema有三部分内容,第一是命名空间,第二是元素和属性的定义,第三是语法和建议编写的方式。Schema基于xml语法,编写更加的合理,使用命名空间支持名称相同的元素,完成了对java或者所有对象的修饰并且提供了大量的数据类型。

命名空间

先来讲解命名空间,所谓命名空间就等于包,跟java中的包是一个作用,下图为定义一个schema:

 

在xml中引入schema,需要用schemaLocation属性来指定,此属性有两个值,第一个值是需要使用的命名空间,第二个值是供命名空间使用的xmlschema的位置,两者之间用空格分隔,下图中没有体现,读者可参考spring中的配置,还需要注意的是,使用schemaLocation属性时,需要指定该属性来自哪里。

 

通过文件路径引入:

 

元素和属性的定义

元素是有element来定义,复杂类型由complexType表示,见下图:

 

属性的定义包含在complexType内部:

 

语法和建议的编写方式

Schema有三大种编写方式的方式,RussianDoll、SalamiSlice和Venetian Blind。

RussianDoll:只有一个根元素,通过嵌套的方式完成编写,结构清晰,但不能重用。编写示例就是文章前面元素和属性定义中讲到的那种方式。

SalamiSlice:和上边的玩偶相反,什么节点都不包含,能够最大化重用,根元素不清晰。

 

VenetianBlind:集成了以上两种方式的优点。只有一个根结点,一般重用不是对元素的重用,更多是对类型的重用,因此,对于schema不仅有complexType还有simpleType。

 

一般是一个schema对应一个java类,将两个schema组合可以使用include标签,将schema转换成一个java对象可以使用xjc命令,用法可百度之。

标签