Java and XML_读书笔记_2010-05-17

来源:互联网 发布:红蜘蛛调色软件 编辑:程序博客网 时间:2024/05/01 17:39

五、XML模式

l  XML模式能更精确的处理XML结构约束的表示之外还为约束数据的处理提供一个XML样式。模式只是一个XML文档,受DTD的约束。对于XML模式而言,XML DTD只是一种创建文档约束的手段。因为XML模式是为了强化XML文档的有效性,它必须采用一种机制,而不是自己定义约束条件。这种机制必须是一个DTD。但是原始的DTD允许创建一个模式,这个模式允许所有其他文档可以完全抛弃DTD。(古怪的逻辑)

l  XML模式文档以一个标准的XML声明作为开头然后引用XML模式的名字空间。

l  可接受的操作时经常使用schema作为XML模式文档的根元素,然后是规定一些名字空间的定义,定义的数量应与我们处理原始的XML文档定义的相当。

l  创建缺省的名字空间声明<schema xmlns=”http://www.w3.org/1999/XMLSchema”>任何元素不是带有特定名字空间前缀,就是带有另一个与缺省的名字空间相关联的名字空间前缀
<schema targetNamespace="http://www.oreilly.com/catalog/javaxml"
      xmlns:JavaXML="http://www.oreilly.com/catalog/javaxml"
      xmlns="http://www.w3.org/1999/XMLSchema"

>          targetNamespace属性让模式知道它的约束条件作用的目标是第一个名字空间

l  指定元素:
<element name=”[Name of Element]”
                       type=”[Type of Element]”
                       [options…]

>
[Name of Element]
是要约束的XML文档中的元素名字。与DTD不同,该元素的名字空间不会为元素加前缀。目标名字空间是JavaXML,所有元素的说明以及我们创建的用户自定义类型的元素必须被应用于或被指派给那个目标名字空间。这也有助于创建一个更加原始的模式,因为在元素被定义后才能使用名字空间。
[Type of Element]
要么是一个预定义的XML模式数据类型,要么是一个用户定义类型。
XML
模式数据类型:类型(子类型,用途)。string(NMTOKEN/language,字符串)boolean(N/A,(true or false))float(N/A,32位浮点类型)double(N/A,64位浮点类型)decimal(integer,标准十进制符号正数或负数)timeInstant(N/A,日期和时间的组合表示单一时刻的时间)timeDuration(N/A,一段时间)recurringInstant(date/time,在一个timeDuration中重现的某一特定时间)binary(N/A,二进制数据)uri(enumeration,一个URI)

l  用户自定数据类型:在XML模式中的complexType元素允许我们定义复杂的数据类型
<complexType name=”[Name of Type]”>
      <[Element Specification]>
      <[Element Specification]>
     

</complexType>

l  可以创建一个ChapterType数据类型:
<complexType name=”ChapterType”>
     

</complexType>
这个类型将成为目标名字空间JavaXML的一部分。为了给Chapter元素指定这个类型,使用如下的元素说明方式<element name=”Chapter” type=”JavaXML:ChapterType” />
无论我们为chapter元素指定何种元素结构,ChapterType元素类型将决定如何约束Chapter元素。当创建这个类型时,它是在目标名字空间JavaXML中被创建。但是在模式中使用的元素(element,complexType等)并没有带名字前缀,这是因为他们属于缺省名字空间,即XML的模式名字空间。所以如果我们把类型指定为ChapterType,解析器将在缺省名字空间中查找这个类型,如果找不到,就产生异常。为了通知解析器到哪里查找类型定义,我们必须给他一个正确的名字空间,这是是JavaXML

l  制定嵌套元素
<complexType name=”ChapterType”>
      <element ref=”JavaXML:Heading” />
      <element ref=”JavaXML:Topic” />

</complexType>

l  ref属性告诉XML解析器被命名的元素的定义是在模式的另一个部分中。如果这些元素仅引用一次,可做如下修改:
<complexType name=”ChapterType”>
      <element name=”Heading” type=”string” />
      <element name=”Topic” type=”string” />

</complexType>

l  显示类型(explicit type)是指定了类型的名字,并且使用该类型的元素通常分布在文件的不同部分。这是一种面向对象的概念。然而如果一种类型专门适用于某一元素,那么给这种类型命名就没有丝毫用处。通常要使用隐含类型(implicit type),有事也称无名类型
     
显式类型:
<complexType name="BookType">
           <element name="Title" type="string" />
           <element name="Contents" type="JavaXML:ContentsType" />
           <element name="copyright" type="string" />
</complexType>
<complexType name="ContentsType">
           <element name="Chapter" type="JavaXML:ChapterType" />
           <element name="SectionBreak" type="string" />
</complexType>
<complexType name="ChapterType">
           <element name="Heading" type="string" />
           <element name="Topic" type="string" />
</complexType>

金字塔式,从根部即预定义类型开始分析

***********************************************
隐式类型:
      <complexType name="ContentsType">
           <element name="Chapter">
                 <complexType>
                      <element name="Heading" type="string" />
                      <element name="Topic" type="string" />
                 </complexType>
           </element>
           <element name="SectionBreak" type="string" />
      </complexType>

这种隐含类型允许模式的“流水线化(streamlining)”。当某种类型永远不会被多个元素使用时,可以使用隐含类型

l  用隐含类型把元素内容定义为空:
<element name=”SectionBreak”>
      <complexType content=”empty” />

</element>
XML
模式规范的早期版本定义了空数据类型,现在已被删除。如果指定元素类型为空,将不允许使用一种比较直观的方式定义空元素应该具有哪些属性。

l  元素出现次数:在XML模式中,属性minOccursmaxOccurs被用在元素的说明中。
<element name=”[Element Name]”>
            Type=”[Element Type]”
            minOccurs=”[Minimum times allowed to occur]”
            maxOccurs=”[Maximum times allowed to occur]”

</element>

l  属性定义:使用XML模式的attribute元素来定义属性。类似于element元素,XML模式定义了attribute元素,使用这个元素指定外围元素或者类型定义可以包含哪些属性。
<attribute name=”[Name of attribute]”>
            Type=”[Type of attribute]”
            [Attribute Options]

</attribute>
属性定义和元素定义几乎完全相同。属性的数据类型和元素的相同,这就意味着我们可以非常容易地把属性定义加入模式。对于任何一个给定了数据类型的元素,我们可以在类型定义加入需要的属性。对于那些目前没有指定数据类型的元素,我们必须为其指定数据类型。这让我们加入的属性知道它们属于的元素的数据类型。在这些新的元素类型中,我们可以使用contentType元素的content属性指定内容类型,这样就保留了初始的约束条件,并且还可以加入属性定义。
XML
模式使用minOccurs属性来描述元素,如果该属性值为1,表示该元素是强制必须出现的。XML模式不是用#FIXED符号。使用default属性指定缺省值。XML属性的定义是展开的,同时使用了simpleType元素。这个元素允许现有的数据类型包括在它所表示的值中。所有这些值都在enumeration元素中北指定。使用关键字base指定这个元素的基本类型     <attribute name="focus" type="string" default="Java">
           <simpleType base="string">
                 <enumeration value="XML">
                 <enumeration value="Java">
            </simpleType>
      </attribute>

l  完整的XML模式实例:
<?xml version="1.0"?>

<schema targetNamespace="http://www.oreilly.com/catalog/javaxml"
      xmlns="http://www.w3.org/1999/XMLSchema"
      xmlns:JavaXML="http://www.oreilly.com/catalog/javaxml">

      <element name="Book" type="JavaXML:BookType" />

      <complexType name="BookType">
           <element name="Title" type="string" />
           <element name="Contents" type="JavaXML:ContentsType" />
           <element name="Corpyright" type="string" />
      </complexType>

      <complexType name="ContentsType">
           <element name="Chapter" maxOccurs="*">
                 <complexType>
                      <element name="Heading" type="string" minOccurs="0" />
                      <element name="Topic" maxOccurs="*">
                            <complexType content="string">
                                  <attribute name="subSections" type="integer" />
                            </complexType>
                      </element>
                      <attribute name="focus" type="string" default="Java">
                            <simpleType base="string">
                                  <enumeration value="XML">
                                  <enumeration value="Java">
                            </simpleType>
                      </attribute>
                 </complexType>
           </element>
           <element name="SectionBreak" minOccurs="0" maxOccurs="*">
                 <complexType content="empty">
           </element>
      </complexType>
     
</schema>