• Java高级特性 第12节 XML技术


    一、XML简介

       1. XML介绍

      XML是可扩展标记语言(Extensible Markup Language ),XML是一种数据格式,类似 HTML,是使用标签进行内容描述的技术,与HTML不同的是,XML的标签和属性都是根据业务需求自定义的。

      XML可以作为配置文件的载体,例如servlet、struct2、hibernate的配置都是通过XML进行配置的:web.xml(web工程项目的核心配置文件)、beans.xml(Spring框架)、hibernate-config.xml(hibernate框架)、mapping.xml(hibernate和mybatis框架)等。

      XML有以下特点:

    • XML与操作系统、编程语言的开发平台都无关(通用的数据交换格式)
    • 实现不同系统之间的数据交换(包括系统的配置文件)
    • 是一种标记语言,没有固定的标记,可以自定义创建

      作用:数据交互、配置应用程序和网站等

      2. XML文档结构

      下面是一个XML文档BookStore.xml:

    <bookstore>
        <book category="COOKING">
            <title lang="en">Everyday Italian</title>
            <author>Giada De Laurentiis</author>
            <year>2019</year>
            <price>30.00</price>
        </book>
        <book category="CHILDREN">
            <title lang="en">Harry Potter</title>
            <author>J K. Rowling</author>
            <year>2005</year>
            <price>29.99</price>
        </book>
        <book category="WEB">
            <title lang="en">Learning XML</title>
            <author>Erik T. Ray</author>
            <year>2015</year>
            <price>39.95</price>
        </book>
    </bookstore>

      它的树形结构如下:

      

    • XML 的声明
    <?xml version=”1.0” standalone=”yes” encoding=”UTF-8”?>

      这是一个XML处理指令。处理指令以 <? 开始,以 ?> 结束。<? 后的第一个单词是指令名,如xml, 代表XML声明。version, standalone, encoding 是三个特性,特性是由等号分开的名称-数值对,等号左边是特性名称,等号右边是特性的值,用引号引起来。

      • version: 说明这个文档符合1.0规范
      • standalone: 说明文档在这一个文件里还是需要从外部导入, standalone 的值设为yes 说明所有的文档都在这一文件里完成 
      • encoding: 指文档字符编码
    •  标签

      在XML中,用尖括号括起来的各种标签来标记数据,标签成对出现来界定字符数据,XML文档中可以包含任意数量的标签。

      标签分为两大类:
      单标签:<标签名 属性名=属性值 属性名=属性值/>
      双标签:<标签名 属性名=属性值 属性名=属性值></标签名>

    • 根元素

      每个XML文档有且仅有一个根元素。如<bookstore></bookstore>。

      根元素是一个完全包含文档中其他所有元素的元素,根元素的起始标记要放在所有其它元素起始标记之前,根元素的结束标记根放在其它所有元素的结束标记之后。

    • 元素

      元素的基本结构由 开始标记,数据内容,结束标记组成,如

    <Person>
      <Name>Zhang San</Name>
      <Sex>Male</Sex>
    </Person>

      需要注意的是:

      • 元素标记区分大小写,<Name> 与 <name>是两个不同的标记;  
      • 结束标记必须有反斜杠,如 </Name>;

      XML元素标记命名规则如下:

      • 名字中可以包含字母,数字及其它字母
      • 名字不能以数字或下划线开头
      • 名字不能用xml开头
      • 名字中不能包含空格和冒号
    • 属性

      标签的属性可以有多个,多个属性写在标签上使用空格隔开就行。如:<元素名  属性名="属性值" 属性名="属性值"></>

      • 属性值用双引号包裹;
      • 一个元素可以有多个属性;
      • 属性值中不能直接包含<、“、&(不建议:‘、>),最好都不要写;
    • XML注释
    <!-- this is comment -->

      需要注意的是:

      • 注释中不要出现“--”或“-”;
      • 注释不要放在标记中;
      • 注释不能嵌套 ;
    • XML中特殊字符的处理

      (1)在 XML 中,有 5 个预定义的实体引用:

    &lt; < 小于
    &gt; > 大于
    &amp; & 和号
    &apos; ' 单引号
    &quot; " 引号

      在 XML 中,只有字符 "<" 和 "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

       (2)如果在元素的文本中存在大量的特殊字符,可以使用CDATA处理:

      语法格式:<![CDATA[要显示的字符]]>

      注意:在 XML 中,空格会被保留。HTML会把多个连续的空格字符裁减(合并)为一个:

    HTML:	Hello           my name is David.
    输出:	Hello my name is David.

      但在 XML 中,文档中的空格不会被删节。

    • 格式良好的XML文档
      • 所有XML元素都必须有结束标签(</……>)
      • XML标签对大小写敏感
      • XML必须正确的嵌套
      • 同级标签以缩进对齐
      • 元素名称可以包含字母、数字或其他的字符
      • 元素名称不能以数字或者标点符号开始(<5name>是错误的;<name5>是正确的)
      • 元素名称中不能含空格(<student name>是错误的;<studentname>是正确的的)

    二、在XML中使用命名空间

      命名空间在XML中可以用作元素或属性名称的名称集合,它们用来标识来自特定域(标准组组、公司、行业)的名称。

      1. 空间命名的必要性

      XML解析器在解析XML文档时,对于重名的元素,可能出现解析冲突,命名空间有助于标准化元素和属性,为它们加上唯一标识。

      2. 声明命名空间

      语法:xmlns:[prefix]="[命名空间的URL]"

    • prefix是前缀名称,它用作命名空间的别名;
    • xmlns是保留属性;

      3. 属性和命名空间

      除非带有前缀,否则属性属于它们的元素所在的命名空间。

      4. 命名空间的应用

      例如,这个 XML 文档携带着某个表格中的信息:

    <h:table xmlns:h="http://www.w3.org/TR/html4/">
       <h:tr>
       <h:td>Apples</h:td>
       <h:td>Bananas</h:td>
       </h:tr>
    </h:table>
    

      此 XML 文档携带着有关一件家具的信息: 

    <f:table xmlns:f="http://www.w3school.com.cn/furniture">
       <f:name>African Coffee Table</f:name>
       <f:width>80</f:width>
       <f:length>120</f:length>
    </f:table>
    

      与仅仅使用前缀不同,我们为 <table> 标签添加了一个xmlns属性,里面的网址是统一资源标识符,目的是唯一标识一个命名空间,每一个统一资源标识符都是不一样的,但是没有实际意义,但是一般都能连到一个网页,取值这样就为前缀赋予了一个与某个命名空间相关联的限定名称。

    三、验证XML文档

         DTD 是 DocType Definition 的简称,中文翻译为文档类型定义,DTD 的作用是定义 XML 文档的合法构建模块。它使用一系列的合法元素来定义文档结构,用于约定 XML 的格式。规定了文档中所使用的元素、实体、元素的属性、元素与实体之间的关系。

      DTD主要作用有:

    • 使用 DTD 可以提供一种统一的格式。
    • 使用 DTD 可以保证数据交流和共享的顺利进行。DTD 使用户能够不依赖具体的数据就知道文档的逻辑结构。
    • 使用 DTD 可以验证数据的有效性。DTD 对文档的逻辑结构进行了约束,这种约束可以比较宽松,也可以十分严格。可以根据 DTD 检查数据,以验证其是否符合规定和要求,这可以保证数据的正确和有效。

       1. 使用DTD验证XML文档

       DTD 主要定义方式:

       (1)内部定义法,DTD 文件放在 XML 文件内部。

     <!DOCTYPE 根元素 [元素定义]>  
    

      DTD元素定义语法: <!ELEMENT NAME CONTENT>

    • ELEMENT : 关键字
    • NAME : 元素名称
    • CONTENT:元素类型

      如下面的例子: 

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE bookstore [
        <!ELEMENT bookstore (book+)>
        <!ELEMENT book (bookname,author,price)>
        <!ATTLIST book id CDATA #REQUIRED>
        <!ELEMENT bookname (#PCDATA)>
        <!ELEMENT author (#PCDATA)>
        <!ELEMENT price (#PCDATA)>
    ]>
    <bookstore>
        <book>
                <bookname>唐诗</bookname>
                <author>libai</author>
                <price>112.00元</price>
        </book>
        <book>
                <bookname>降龙十八讲秘籍</bookname>
                <author>郭芙</author>
                <price>5元</price>
        </book>
    </bookstore>

      常用的元素类型如下:

    • #PCDATA:  可以包含任何字符数据,但是不能在其中包含任何子元素,如: <!ELEMENT title (#PCDATA)>
    • EMPTY:用于指示元素的主体为空。比如<br/>
    • ANY:用于指示元素的主题内容为任意类型。
    • (子元素):指示元素中包含的子元素。
    • 纯元素类型,只包含子元素,并且除这些子元素外没有文本内容,如:<!ELEMENT poems(poem*)>

      DTD中一些符号的用途;

      

      1) 如果子元素用逗号隔开,必须按照声明顺序去编写XML文档。

      例如:<!ELEMENT FILE(TITLE, AUTHOR, EMAIL)>

      2)如果子元素用"|" 分开,说明任选其一。
      例如:<!ELEMENT FILE(TITLE|AUTHOR|EMAIL)>
      3)用+、*、? 来表示元素出现的次数。
      如:<!ELEMENT MYTITLE((TITLE*,AUTHOR?,EMAIL))*|COMMIT> 

      DTD属性(ATTLIST)定义:

    <!ATTLIST 元素名称
        属性名 属性类型  约束
        属性名 属性类型  约束
        ......
    >

      属性声明举例:

    <!ATTLIST 商品
     类别 CDATA  #REQUIRED  必须的
     颜色 CDATA  #IMPLIED       可选的
    >

      对应的XML为:<商品 类别="服装" 颜色="黄色" />

      属性值类型:

    • CDATA:表示属性的取值为普通的文本字符串。
    • ENUMERATED(DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)
    • ID:表示属性的取值不能重复(不能只写数字)

      设置说明:

    • #REQUIRED:表示该属性必须出现
    • #IMPLIED:表示该属性可有可无。
    • #FIXED:表示该属性的取值为一个固定值。语法:#FIXED "固定值"
    • 直接值:表示属性的取值为默认值。

      DTD 定义属性示例:

    <!ATTLIST 页面作者
       姓名   CDATA    #IMPLIED
       年龄   CDATA    #IMPLIED
       联系信息  CDATA  #REQUIRED
       网站职务  CDATA  #FIXED  "页面作者"
       个人爱好  CDATA  "上网"
    >

      (2) 使用外部DTD验证XML

      语法格式:<!DOCTYPE  根元素  SYSTEM "DTD文件路径">

      如下例子:

      book.xml:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE bookstore SYSTEM "bookstore.dtd">
        <bookstore>
        <book>
                <bookname>带你飞培训教程</bookname>
                <author>huangjinjin</author>
                <price>1.00元</price>
        </book>
        <book>
                <bookname>降龙十八讲秘籍</bookname>
                <author>洪七公</author>
                <price>0.01元</price>
        </book>
    </bookstore>

      bookstore.dtd:

    <?xml version="1.0" encoding="UTF-8"?>  
        <!DOCTYPE bookstore [  
        <!ELEMENT bookstore (book+)>  
        <!ELEMENT book (bookname,author,price)>  
        <!ATTLIST book id CDATA #REQUIRED>  
        <!ELEMENT bookname (#PCDATA)>  
        <!ELEMENT author (#PCDATA)>  
        <!ELEMENT price (#PCDATA)>  
        ]>  

      2. 使用Schema验证XML文档

      XML Schema 是基于 XML DTD 的替代者,XML Schema 描述 XML 文档的结构。XML Schema 语言也称作 XML Schema 定义(XML Schema Definition 简称 XSD)。DTD 不是通过 XML 语法定义文档结构,不能定义数据类型和限制;Schema 通过 XML 语法定义文档结构,可以定义数据类型和限制

      XML Schema 对 XML 文件的主要约定有:

    • 定义可出现在 XML 文档中的元素;

    • 定义可出现在 XML 文档中的属性;

    • 定义哪个元素是子元素;

    • 定义子元素的次序;

    • 定义子元素的数目;

    • 定义元素是否为空,或者是否可包含文本;

    • 定义元素和属性的数据类型;

    • 定义元素和属性的默认值以及固定值。

      1)Schema文档结构

      Schema文档本身是一个XML文档,所以必须满足XML文档结构。在每个Schema文档中必须包含一个根元素<xs:schema>

      note.xsd:

    <?xml version="1.0"?>
    <!--每个Schema中都必须包含xs:schema根节点,然后在根节点中定义内容!-->
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
          targetNamespace="http://www.w3school.com.cn"
          xmlns="http://www.w3school.com.cn"
          elementFormDefault="qualified">
        定义内容
    </xs:schema>

      说明:

    • xmlns:xs="http://www.w3.org/2001/XMLSchema":显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"。同时它还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs:
    • targetNamespace="http://mynamespace/myschema" :显示被此 schema 定义的元素验证的XML来自的命名空间。
    • xmlns="http://www.w3school.com.cn" :指定默认的命名空间 。
    • elementFormDefault="qualified" :指目标XML是否遵循本Schema,qualified表示遵循,unqualified表示不遵循。

      2)在XML中引用Schema文档   

    <?xml version="1.0"?>
    <!--引用Schema文档-->
    <note xmlns="http://www.w3school.com.cn"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
      <to>George</to>
      <from>John</from>
      <heading>Reminder</heading>
      <body>Don't forget the meeting!</body>
    </note>

      说明:

    • xmlns="http://www.w3school.com.cn" :规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 "http://www.w3school.com.cn" 这个命名空间。
    • xsi:schemaLocation="http://www.w3school.com.cn note.xsd":指定文件路径。

      3) Schema常用数据类型:

      Schema中支持丰富的数据类型,可以简单分为简单类型和复合类型

    • 简单类型包括:
      • 内置的数据类型。
        • 基本的数据类型
    基本的数据类型
    数据类型 描述
    string 字符串
    boolean  布尔类型 
    decimal  特定精度的数字 
    float  单精度浮点数 
    double  双精度浮点数 
    duration  表示持续时间/日期格式 
    dateTime  完整日期格式
    time 代表时分秒 
    date  代表日期 
        • 扩展的数据类型     
    扩展的数据类型
    数据类型 描述
    ID 用于唯一表示元素
    IDREF 应用ID元素的属性或属性
    ENTITY
    实体类型
    long
    表示长整型:-9223372036854775808~9223372036854775807
    int 表示整型:-2147483648~--2147483647
    short 表示短整型:-32768~32767
    byte
    整型:-128~127
      • 用户自定义的简单类型(通过simpleType定义)
    • 复合类型(通过complexType定义)

      4)Schema中的元素类型

      1、根元素:schema。

        包含已经定义的schema。

    • 属性:
      • xmlns:schema的命名空间。
      • targetNamespace:要验证的XML文件的命名空间。
      • elementFormDefault:要验证的XML是否遵循当前的验证命名空间。

      2、用于定义元素和属性的元素:element、attribute、group、attributeGroup。

      1) element:声明一个元素

    • 属性:
      • name:需要限定XML文档元素的名称。
      • type:需要限定XML文档元素的类型。
      • ref:引用外部定义的元素
      • minOccurs:元素最小出现的次数。
      • maxOccurs:元素最大出现的次数。

        例:声明student节点,类型为string类型,最小出现1次,最多出现3次。

    <xs:element name="student" type="xs:string" minOccurs="1" maxOccurs="unbounded" />

      2)group:声明一个分组

        将多个元素声明放到一个分组中,然后在其他元素中通过group引用。

    • 属性:name分组的名称

      例:将name和age定义为一个分组,然后在student中引用这个分组。

    <!--外部定义一个标记-->
    <xs:element name="student">
      <xs:complexType>
        <!--引用分组标记-->
        <xs:group ref="stuinfo" maxOccurs="unbounded"></xs:group>
      </xs:complexType>
    </xs:element>
    <!--定义一个分组标记--> <xs:group name="stuinfo">   <xs:sequence>     <!--自定义的子元素:name和age,name类型为string,age类型为byte,只能出现1次-->     <xs:element name="name" type="xs:string"></xs:element>     <xs:element name="age" type="xs:byte"></xs:element>   </xs:sequence> </xs:group>

      3)attribute元素:

        用于声明一个属性:

    • 属性:
      • name:属性名称
      • type:属性类型
      • user:是否必选,required必选,optional可选,默认可选
      • default:默认值
      • fixed:固定值

      注意:默认值和固定值不能同时出现。

      示例:属性的用法

      Schema文档: 

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
        <xs:element name="students">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="student" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:attribute name="name" type="xs:string" />
                            <xs:attribute name="age" type="xs:byte" />
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>

      XML文档:

    <?xml version="1.0" encoding="UTF-8"?>
    <students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="students.xsd">
        <student name="zhangsan" age="29"/>
        <student name="lisi" age="19"/>
    </students>

       4)attributeGroup属性组

        和前面的元素组类型,在外部定义属性组,然后在元素中引用属性组。

      Schema文档:

    <!--定义属性组:stuattgroup-->
    <xs:attributeGroup name="stuattgroup">
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="age" type="xs:byte"/>
    </xs:attributeGroup>
    
    <!--引用属性组-->
    <xs:element name="student" maxOccurs="unbounded">
        <xs:complexType>
            <xs:attributeGroup ref="stuattgroup"></xs:attributeGroup>
        </xs:complexType>
    </xs:element>    

      3、用于定义简单类型:simpleType。

        它决定了元素和属性值得约束和相关信息。

      属性:name

      常用的两种方式:

      1)restriction:约束

        对现有类型进行扩充。

      示例:设置年龄必须在18-100之间

    <xs:attributeGroup name="stuattgroup">
        <xs:attribute name="name" type="xs:string"/>
        <!--将原来的xs:int换位age类型-->
        <xs:attribute name="age" type="age"/>
    </xs:attributeGroup>
    <!--扩展int类型,设置int取值只能是18到100,包含18和100-->
    <xs:simpleType name="age">
        <xs:restriction base="xs:int">
            <xs:minInclusive value="18" />
            <xs:maxInclusive value="100" />
        </xs:restriction>
    </xs:simpleType>

      2)list:列表

        从一个特定的数据类型的集合中选择定义一个简单类型元素。

      Schema文档:

    <!--Schema文档-->
    <!--定义列表数据,其每项子元素为自定义扩展类型-->
    <xs:simpleType name="stuScore">
        <xs:list itemType="stuScoreItem"></xs:list>
    </xs:simpleType>
    <!--定义扩展类型限定0-100之间-->
    <xs:simpleType name="stuScoreItem">
        <xs:restriction base="xs:int">
            <xs:minInclusive value="0" />
            <xs:maxInclusive value="100" />
        </xs:restriction>
    </xs:simpleType>
    <!--声明Scores节点,包含list格式数据-->
    <xs:element name="scores" type="stuScore">        
    </xs:element>
    
    <!--XML文档中的数据-->
    <scores xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="scores.xsd">
    10 20 300
    </scores>

      4、用于定义复杂类型:complexType。

        需要使用在节点下包含子节点的情况。

      Schema文档:  

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
        <xs:element name="students">
            <xs:complexType>
                <xs:sequence>
                    <!--通过ref来应用student标记 maxbounded表示不限定出现的次数-->
                    <xs:element ref="student" maxOccurs="unbounded"></xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        
        <!--外部定义一个标记-->
        <xs:element name="student">
            <xs:complexType>
                <xs:sequence>
                    <!--自定义的子元素:name和age,name类型为string,age类型为byte,只能出现1次-->
                    <xs:element name="name" type="xs:string"></xs:element>
                    <xs:element name="age" type="xs:byte"></xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>

      XML文档:

    <?xml version="1.0" encoding="UTF-8"?>
    <students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="students.xsd">
        <student>
            <name>张三</name>
            <age>20</age>
        </student>
        <student>
            <name>李四</name>
            <age>20</age>
        </student>
    </students>

      5、用于进行约束:choice、list、sequence、restriction。

      1) choice

        把一组属性声明组合到一起,一边被复合类型所应用,XML中只能出现限定选项中的一个元素。

      Schema文档:

    <!--设定交通工具只能是自行车,小汽车,摩托车中的一项-->
    <xs:element name="交通工具">
        <xs:complexType>
            <xs:choice>
                <xs:element name="自行车" type="xs:string"></xs:element>
                <xs:element name="小汽车" type="xs:string"></xs:element>
                <xs:element name="摩托车" type="xs:string"></xs:element>
            </xs:choice>
        </xs:complexType>
    </xs:element>

      XML文档:

    <交通工具 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vehicle.xsd">
        <自行车></自行车>
        <!--
        <小汽车></小汽车>
        <摩托车></摩托车>
        包含任意一个,包含多个会报错!
        -->
    </交通工具>  

      2)sequence

      表示元素必须按照规定的序列进行显示。

       

  • 相关阅读:
    poj 2195 Going Home
    poj 3068 "Shortest" pair of paths
    aoj 2226 Merry Christmas
    poj 2226 Muddy Fields
    foj Problem 2275 Game
    foj Problem 2283 Tic-Tac-Toe
    XidianOJ 1081 锘爷与矩阵
    XidianOJ 1061 a+boflw
    XidianOJ 1080 锘爷与跳楼塔
    XidianOJ 1017 Codeforce上的rating
  • 原文地址:https://www.cnblogs.com/yutianbao/p/10747842.html
Copyright © 2020-2023  润新知