• XML约束


    本节要点:

    • 了解XML的约束模式
    • 了解DTD
    • 了解Schema

    1   了解XML的约束模式

    计算机程序在处理XML文档之前,必须能够解析出XML文档的内容中各个元素的相关信息。将解析出来的信息再交给下游程序进行下一步处理。Parser就是用于解析XML文档的解析器程序,Parser可以独立使用,也可以成为编辑软件或浏览器的一部分。

    所以XML文档必须严格遵循一定的语法,遵守XMl基本语法规则和规范的XML文档就称为Well-formed XML。一个XML文档必须是格式良好的,并且内容满足某些条件的约束。

    约束模式是一套规则,对XML文档中的内容作出限制。约束模式定义了XML文档中允许出现的元素名,元素中的属性,内容类型,及元素间的嵌套关系和出现顺序。约束模式通常都在一个单独的文件中进行定义。约束模式的内容也需要遵循一定的语法规则,使用XML约束模式语言来定义XML约束模式的语法规则,模式文档采用某种约束模式语言编写如:XML DTD、XDR、SOX、XML Schema等,应用最广泛和具有代表意义的是XML DTD和XML Schema。

    2   DTD

    XML DTD(Document Type Definition 文档类型定义)

    • 最早出现的一种XML约束模式语言
    • 目前使用最广泛的一种XML约束模式
    • 以.dtd为扩展名
    • Struts使用较多

    有效的XML必须遵循XML 的基本语法规则,且符合为它指定的某个XML约束模式的XML文档。校验是将一个XML文档和它所引用的XML约束模式进行比较分析,看其中的内容是否符合XML约束模式的过程。

    2.1 DTD语法

    • l DTD(document type definition):文档类型定义
    • l 作用:约束XML的书写规范

    1.       一个简单例子

    book.xml

    <?xml version="1.0"encoding="UTF-8"?>

    <!DOCTYPE books SYSTEM "book.dtd">

    <books>

         <book>

                <author>张三</author>

                <title>一本好书</title>

                <price>20.00</price>

         </book>

    </books>

    book.dtd

    <!ELEMENTbooks (book+)>

    <!ELEMENTbook (author,title,price)>

               <!ELEMENTauthor (#PCDATA)>

               <!ELEMENTtitle (#PCDATA)>

               <!ELEMENTprice (#PCDATA)>

    注:元素和子元素属性之间有空格分隔,如author  (#PCDATA)

    1)         元素声明语法

    语法格式:

    <!ELEMENT 元素名称 使用规则>

    使用规则:

    定义元素中包含的组成部分,以及每种组成成分出现的次数、次序,还可以是某些成分进行某种关系组合后出现的次数、次序。

    元素通配符使用

    元字符

    含义

    +

    出现一次或多次

    *

    出现零次或多次

    可选,不出现或出现一次

    (  )

    一组要共同匹配的表达式

    |

    或(OR)

    元素A, 元素B, 元素C

    元素之间以逗号分割,要求严格遵从顺序要求

    元素A  元素B  元素C

    元素之间以空格分割,无须遵从顺序要求

    示例:

    (book+)

        表示books元素中可以包含一个或多个book元素

    (title,author,price)

    • 表示book元素中要嵌套title、author、price子元素,并且这些子元素要按顺序依次出现,只能出现一次
    • 如果没有“,”隔开,表示各子元素可以任意次序出现,但必须且只能出现一次
    • 如果使用“|”隔开,表示只能出现它们之中的任何一个

    (#PCDATA)

     PCDATA: parse character data

    用于表示元素中的内容是普通文本字符串。

    2)     属性声明语法

    语法格式:

    <!ATTLIST 标签名 属性列表 属性类型 出现方式>

    “出现方式”设置

    设置

    描述

    #REQUIRED

    表示这个属性是必须的

    #IMPLIED

    表示这个属性的值是可选的

    #FIXED

    表示这个属性有一个固定的不能更改的值

    默认

    表示这个属性有一个默认值

     

    “属性类型”设置

    设置

    描述

    CDATA

    文本类型

    Enumerated

    一个字符串值得枚举,表示可以任选其中一个

    ID

    表示唯一标示符(注:由ID表示的属性不能以数字开头)

    ENTITY

    一个外部实体(现在的浏览器不支持)

    示例:

    books.dtd

     1 <!ELEMENT books (book+)>
     2 
     3     <!ELEMENT book ((author,title,price)|comment+)>
     4 
     5        <!ELEMENT author (#PCDATA)>
     6 
     7        <!ELEMENT title (#PCDATA)>
     8 
     9        <!ELEMENT price (#PCDATA)>
    10 
    11    
    12 
    13 <!ATTLIST comment
    14 
    15 author CDATA #IMPLIED
    16 
    17 title CDATA #REQUIRED
    18 
    19 price CDATA #IMPLIED
    20 
    21 language CDATA #FIXED "Chinese"
    22 
    23 type (java|.net|oracle) "java"
    24 
    25 id ID #REQUIRED
    26 
    27 > 

    Books.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 
     3 <!DOCTYPE books SYSTEM "books.dtd">
     4 
     5 <books>
     6 
     7     <book>
     8 
     9        <author>joy</author>
    10 
    11        <title>java core</title>
    12 
    13        <price>100</price>
    14 
    15     </book>
    16 
    17     <book>
    18 
    19        <comment id="S001" author="joy" title="Java" price="20" language="Chinese" />
    20 
    21        <comment id="S002" author="joy" title="Java" price="20" language="Chinese" />
    22 
    23     </book>
    24 
    25 </books>

    2.2 引入外部DTD文件

    使用文档类型声明DOCTYPE语句引入DTD。格式如下:

    <!DOCTYPE 文档类型名称 SYSTEM “DTD文件的URL”>

    <! DOCTYPE 文档类型名称 PUBLIC “DTD名称” “DTD文件的URL”>

    注:

    • 文档类型名称由编写者自己定义,通常是使用XML文档的根元素名称作为文档类型名称
    • SYSTEM表示XML文档所遵循的是一个本地或者组织内部所编写和使用的DTD文件
    • PUBLIC表示XML文档遵循的是一个由权威机构制定的,公开提供给特定行业或公众使用的DTD文件
    • “DTD名称”需要使用双引号括起来,应该符合一些标准的规定
    • SYSTEM 后面的“DTD文件的URL”可以是相对URL,也可以是绝对URL;PUBLIC 后面的“DTD文件的URL” 指定DTD文件在Internet上的绝对URL
    • <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">中:
      •   “-” 表示ISO标准的DTD,“+”被改进的非ISO标准的DTD,“-”未被改进的非ISO标准的DTD
      •   “Apache Software Foundation”表示 DTD所有者的名称
      •   “DTD Struts Configuration 2.3”表示DTD所描述的文件的说明
      •   “EN“表示DTD语言的种类

    2.3 嵌入DTD定义语句

    可以在XML中嵌入使用DTD。

    语法格式:

     

    3   Schema

    XML Schema

    • 对XML文档内容进行约束的另外一种模式
    • 目的是为了克服DTD的局限性,为XML提供丰富的语法结构
    • XML Schema已经成为W3C的正式推荐标准
    • 以.xsd为扩展名

    XML Schema VS DTD:

    • XML Schema符合XML语法结构。
    • DOM、SAX等XML API很容易解析出XML Schema文档中的内容。
    • XML Schema对名称空间支持得非常好。
    • XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
    • XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
    • XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。

    schema的基础是数据类型,理解schema的最好方式是将它看成是数据类型的层次结构,在层次结构的底层是内置的不可再划分的数据类型,如:整数、字符串、浮点数、日期等,表示xml文件可能包含的数据的基本单元。通过组合这些简单的数据类型,可以创建出各种不同的复杂数据类型,然后可以使用这些数据类型来定义元素和属性。这样,你将为xml文档的根元素、子元素、一直到最底层的包含文档数据的元素定义数据类型,因此,学习创建xsd schema,大体上就成了一个定义数据类型的过程。

    示例:(简单)

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 
     3 <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/fullname"
     4 
     5     xmlns:tns="http://www.example.org/fullname" elementFormDefault="qualified">
     6 
     7     <!-- xmlns: xml name space 导入一个w3的名称空间,用来支持基础数据类型等
     8 
     9        targetNamespace:可以等同于java里面定义的包名
    10 
    11        xmlns:tns :给命名空间取个别名
    12 
    13      -->
    14 
    15     <element name="fullname" type="tns:fnm"></element>
    16 
    17     <complexType name="fnm">
    18 
    19        <sequence>
    20 
    21            <element name="first-name" type="string"></element>
    22 
    23            <element name="last-name" type="string"></element>
    24 
    25        </sequence>
    26 
    27     </complexType>
    28 
    29 </schema>
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 
     3 <fullname xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4 
     5        xmlns="http://www.example.org/fullname"
     6 
     7        xsi:schemaLocation="http://www.example.org/fullname fullname.xsd">
     8 
     9     <first-name>zhou</first-name>
    10 
    11     <last-name>xiaoxiao</last-name>
    12 
    13 </fullname>

    示例:(复杂点)

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 
     3 <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/factory"
     4 
     5     xmlns:pre="http://www.example.org/factory" elementFormDefault="qualified">
     6 
     7     <element name="factory" type="pre:fac"></element>
     8 
     9     <complexType name="fac">
    10 
    11        <sequence maxOccurs="unbounded">
    12 
    13            <element name="worker">
    14 
    15               <complexType>
    16 
    17                   <attribute name="id" type="ID" use="required"></attribute>
    18 
    19                   <attribute name="name" type="string"></attribute>
    20 
    21                   <attribute name="age">
    22 
    23                      <simpleType>
    24 
    25                          <restriction base="unsignedInt">
    26 
    27                             <maxInclusive value="80"></maxInclusive>
    28 
    29                             <minInclusive value="1"></minInclusive>
    30 
    31                          </restriction>
    32 
    33                      </simpleType>
    34 
    35                   </attribute>
    36 
    37                   <attribute name="sex" >
    38 
    39                      <simpleType>
    40 
    41                          <restriction base="string">
    42 
    43                             <enumeration value="男"></enumeration>
    44 
    45                             <enumeration value="女"></enumeration>
    46 
    47                          </restriction>
    48 
    49                      </simpleType>
    50 
    51                   </attribute>
    52 
    53               </complexType>
    54 
    55            </element>
    56 
    57        </sequence>
    58 
    59     </complexType>
    60 
    61 </schema>
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 
     3 <factory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4 
     5     xmlns="http://www.example.org/factory"
     6 
     7     xsi:schemaLocation="http://www.example.org/factory factory.xsd">
     8 
     9     <worker id="w001" name="jack" age="25" sex="男"/>
    10 
    11     <worker id="w002" name="tom" age="24" sex="男"/>
    12 
    13     <worker id="w003" name="mary" age="26" sex="女"/>
    14 
    15 </factory>

    作业:

    1.XML文档默认的编码方式是:(     )

           A. ASCII      B. Unicode  C. UTF-16     D. UTF-8

    2.下列元素定义中正确是:(     )

       A. <book></Book>    B. <BOOK></book>

    C. <book></book>     D. <Book></bOOK>

    3. W3C XML Schema文档中,attribute元素的属性use值为(      )表示属性是可选的并且可以具有任何值。

       A. optional     B. prohibited

       C. required     D. fixed

    4. XML (    )提供了一种避免元素命名冲突的方法。

    A.命名空间 B.DTD     C.XSD     D.XSL

    5.描述学校、班级(1-n个班,属性:班级号)、班主任(每个班只有一个)、学生(每个班有多个学生,属性:学号(必须)、姓名(必须)、性别(可选)、生日(可选,必须日期))

    6.写出出下面DTD的一个有效的XML

    <! ELEMENT 联系人 (姓名,(电话|EMAIL),地址?)>

    <! ELEMENT 姓名 (#PCDATA)>

    <! ELEMENT 电话 (#PCDATA)>

    <! ELEMENT EMAIL (#PCDATA)>

    <! ELEMENT 地址 (街道,城市,省份)>

    <! ELEMENT 街道 (#PCDATA)>

    <! ELEMENT 城市 (#PCDATA)>

    <! ELEMENT 省份 (#PCDATA)>

  • 相关阅读:
    代码发布概述图
    gitPython模块
    django重点面试题
    paramiko模块
    Spring Security 注解
    JsonIgnoreProperties JsonIgnore导致RequestBody无法接受参数值
    Http和Rpc区别
    ExceptionHandler(思路参考CustomException)
    Linux安装Nginx
    秒杀扣除库存方案
  • 原文地址:https://www.cnblogs.com/zhouyeqin/p/7421861.html
Copyright © 2020-2023  润新知