• Xml的作用

1、存储和传输复杂的关系模型数据

2、作为配置文件存在,xml中主要配置的一些具有复杂的层级关系的数据,Properties文件中主要配置的一些key和value这样的数据。

    3、因XML内容准确,便于解析的特点,通常被用来存储或传输数据,而非显示数据

 

  在软件系统中,作为配置文件使用

  为提高系统的灵活性,它所启动的模块通常由其配置文件决定

 

  例如一个软件在启动时,它需要启动A、B两个模块,而A、B这两个模块在启动时,又分别需要A1、A2和B1、B2模块的支持,为了准确描述这种关系,此时使用XML文件最为合适不过。

 

<soft>

        <A>

              <A1></A1>

              <A2></A2>

       </A>

       <B>

              <B1></B1>

              <B2></B2>

       </B>

</soft>

二、Xml的语法

2.1文档声明

来声明当前的xml类型

<?xml   ?>  在这个尖括号中书写标签的属性来声明当前的xml类型限定。

属性:   版本号           字符编码           是否是独立存在的xml文档

<?xml version=”1.0” encoding=”编码表” standalone=”yes|no” ?>

 

例如:<?xml version=”1.0”  encoding=”UTF-8” ?>

 

在定义xml的文档声明时 <?之间不能有空白的内容        ?> 它们之间也不能有空格

中间书写的属性使用空格隔开。

 

2.2元素(标签)

xml中的标签也分成单标签和双标签。注意在xml所有的标签必须闭合。xml中的标签区别大小写。

<a1>   <A1>表示2个不同的标签。

 

一个标签分为起始和结束标签(不能省略)。一个标签有如下几种书写形式:

包含标签主体:<mytag>some content</mytag>

不含标签主体:<mytag/>

 

xml中的标签可以嵌套,但是不能交差嵌套。<a1><b1></b1></a1><a1><b1></a1></b1>

xml的标签只能有一个根标签。同时xml标签中的空白内容也会被解析成文本内容。

<网址>www.itcast.cn</网址>

 

标签不能以数字开始,不建议以下划线开始,同时在标签名中不要使用冒号。

 

XML中不会忽略主体内容中出现的空格和换行。

 

标签名可以是中文,但是一定指定能够识别中文的码表。但不建议书写中文。

 

不能以xml(或XML、Xml等)开头----W3C保留日后使用。

2.3属性

在定义标签的时候,可以在标签上书写属性,属性是由key和value值组成。属性名书写的时候也遵守标签名的规则。属性值也不能以数字开始。

 

一个元素可以有多个属性,每个属性都有它自己的名称和取值,例如:<mytag name=“value” …/>

 

属性名称的命名规范与元素的命名规范相同

元素中的属性是不允许重复的

在XML技术中,标签属性所代表的信息也可以被改成用子元素的形式来描述;

 

属性和值之间使用=连接,属性值可以使用单引号也可以使用双引号。

<user uid=”u001” name=”zhang’san”></user>

另外:在xml技术中,标签属性所代表的信息,也可以改为用子元素的形式来描述,如:

<input><type>text</type></input>

2.4注释

xml中的注释和html注释相同。<!--  这里书写具体的注释内容  -->

 

<?xml version="1.0" encoding="utf-8" ?> 此句必须是xml文档的第一句;即便是注释也不能出现在它的上面;

注释不能嵌套;

在eclipse中可以使用ctrl + shift + c 给每行添加注释,也可以使用ctrl + shift + /  添加注释  ctrl + shift + \ 取消注释

注释不能加在声明中及声明前。

2.5文本和特殊字符

在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。

遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。

语法:<![CDATA[ 内容 ]]>

    <![CDATA[

        <itcast>

            <br/>

        </itcast>

    ]]>

对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。

 

2.6特殊指令

处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。

 

例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。    <?xml-stylesheet type="text/css" href="1.css"?>

 

处理指令必须以“<?”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。

 

  • DTD约束xml

3.1 DTD约束介绍

 由于xml的标签由用户自己定义,因此在开发的时候,每个人都可以根据自己的需求来定义xml标签,这样导致项目中的xml难以维护,因此需要使用一定的规范机制来约束xml文件中的标签书写。

 

文档类型定义是一种保证标准通用标记语言、可扩展标记语言文档格式正确的有效方法,可通过比较文档和文档类型定义文件来看文档是否符合规范,元素和标签使用是否正确。文件实例提供应用程序一个数据交换的格式。在文档类型定义正是让标准通用标记语言、可扩展标记语言文件能成为数据交换标准,因为不同的公司只需定义好标准文档类型定义,各公司都能依文档类型定义建立文档实例,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。

3.2 DTD约束快速入门

第一步:先自己定义一个xml文件

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

    <user>

        <name>zhangsan</name>

        <age>23</age>

        <addr>shanghai</addr>

    </user>

    <user>

        <name>lisi</name>

        <age>24</age>

        <addr>beijing</addr>

</user></users>

第二步:书写DTD文件来约束xml文件

DTD文件在定义的时候,扩展名就是dtd。

在xml文件中有多少个标签,就在dtd中书写多少个ELEMENT标签

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

<!ELEMENT users (user+) >

<!ELEMENT user (name,age,addr) >

<!ELEMENT name (#PCDATA) >

<!ELEMENT age (#PCDATA)>

<!ELEMENT addr (#PCDATA)>

3.3 DTD引入方法

DTD主要用来约束xml文件,DTD可以单独写在文件中,也可以直接定义在xml中,可以在xml中引入第三方的公共DTD。

 

外部DTD的引入方式:外部DTD主要指的一个独立的DTD文件。

首先要书写DTD文件,然后在要被约束的xml文件中引入。

<!DOCTYPE 文档根结点 SYSTEM "DTD文件的URL">

文档根结点 指的是当前xml中的根标签。

SYSTEM  引入的系统中存在文件

"DTD文件的URL" DTD存放的位置

 

引入公共的DTD:<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

文档根结点 指的是当前xml中的根标签。

PUBLIC  表示当前引入的DTD是公共的DTD

 

在xml中直接书写DTD<!DOCTYPE  根标签名 [

具体的标签的约束

]>

 

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

<!DOCTYPE users[

    <!ELEMENT users (user+) >    

    <!ELEMENT user (name,age,addr) >    

    <!ELEMENT name (#PCDATA) >    

    <!ELEMENT age (#PCDATA) >  

    <!ELEMENT addr (#PCDATA) >    

]><users>

    <user>

        <name>zhangsan</name>

        <age>23</age>

        <addr>shanghai</addr>

    </user>

    <user>

        <name>lisi</name>

        <age>24</age>

        <addr>beijing</addr>

    </user></users>

3.4 DTD语法介绍

3.4.1 元素

当定义DTD约束xml时候,这时需要在DTD中使用ELEMENT来定义当前xml中可以出现的标签名称。

格式:<!ELEMENT 标签名 约束>  约束来限定当前标签中可以有的子标签,或者当前标签中可以书写的内容

在定义标签名的时候,约束中可以使用一些符号标签具体出现次数

 

?   零次或者一次

*   零次或者多次

+    一次或者多次   users (user+)   表示当前的users标签下可以有一个或者多个user标签

,  用来限定当前的子标签出现的顺序user (name,age,addr)  user标签下只能有name age addr 子标签,并且必须按照name  age  addr的顺序书写

|   user (name|age,addr) user下可以name或者age ,但必须有addr,并且addr必须name或age后面

 

#PCDATA   表明该元素可包含任何字符数据,但不能在其中包含任何子元素。只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明

EMPTY     表明该元素不能有任何子元素或文本,仅可以使用属性。

ANY        表该元素中可以包含任何DTD中定义的元素内容 如:<!ELEMENT note ANY><!ELEMENT age EMPTY >  当前的age标签是个空标签,它不能有文本内容。

3.4.3 实体

实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。

在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。

实体可以理解成Java中预先定义好的一个常量,然后xml文件中就可以引入当前这个定义的实体。

 

定义引用实体

>概念:在DTD中定义,在XML中使用

>语法:<!ENTITY实体名称 “实体内容”>

w3cschool

>引用方式(注意是在XML中使用):&实体名称;

定义参数实体

>概念:在DTD中定义,在DTD中使用

>语法:<!ENTITY % 实体名称 “实体内容”>       分号是必须的

>引用方式(注意是在DTD中使用):%实体名称;

 

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE users[

    <!ELEMENT users (user+) >    

    <!ELEMENT user (name,age,addr) >    

    <!ELEMENT name (#PCDATA) >    

    <!ELEMENT age EMPTY >    

    <!ELEMENT addr (#PCDATA) >    

    <!ATTLIST user id ID #REQUIRED >

    <!ENTITY  abc "上海传智播客123123">

]><users>

    <user id="u001">

        <name>zhangsan</name>

        <age></age>

        <addr>&abc;</addr>

    </user>

    <user id="u002">

        <name>lisi</name>

        <age/>

        <addr>&abc;</addr>

    </user></users>

3.4.2 属性

在xml中的标签上是可以书写属性的,在DTD中就需要对属性进行约束。

格式:<!ATTLIST 标签名 属性名 属性的类型  属性的约束>

如果一个标签上有多个属性<!ATTLIST 标签名 属性名 属性的类型  属性的约束

                                  属性名 属性的类型  属性的约束

  属性名 属性的类型  属性的约束>

<标签名 属性1=””  属性2=””  属性3=”” >

 

属性的类型:

CDATA  属性的value值可以是文本数据

(值1 | 值2 | 值3....   )  表示当前的属性的value值只能是当前括号中的值

ID 表示唯一。对当前标签上的id属性进行限定,并且同一个xml中id不能重复

 

类型     描述

CDATA    值为字符数据 (character data)

(en1|en2|..)      此值是枚举列表中的一个值

ID                  值为唯一的 id,属性且不能以数字开头

IDREF              值为另外一个元素的 id

IDREFS             值为其他 id 的列表

NMTOKEN            值为合法的 XML 名称

NMTOKENS           值为合法的 XML 名称的列表

ENTITY             值是一个实体

ENTITIES           值是一个实体列表

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

NOTATION           此值是符号的名称

XML                 值是一个预定义的 XML 值

 

属性的约束:

#REQUIRED  属性是必须书写的

#IMPLIED  属性是可选得

#FIXED  属性的value是固定的值

Value “值”  代表属性的默认值

 

user name CDATA  fixed “zhangsan”<user name=”zhangsan”>user name CDATA “张三”

<user />

 

属性的类型和约束的组合:

CDATA   REQUIRED

CDATA   Implied

CDATA   fixed

CDATA  “值”

(值1 | 值2 | 值3....   )  REQUIRED

ID   REQUIRED

 

  • Schema约束xml

4.1 Schema约束介绍

Schema它也来约束xml文件的,DTD在约束xml的时候一个xml中只能引入一个DTD,同时DTD它无法对属性以及标签中的数据做数据类型的限定。

Schema它是用来代替DTD来约束xml。

 

Schema文件本身就是使用xml文件书写的,同时它对需要约束的xml中的数据有严格的限定。学Schema主要来学习W3C组织定义的如何在Schema中去约束xml的标签以及属性,还有属性的数据类型,以及标签中子标签的顺序。

要定义一个Schema文件,这时它的扩展名必须是.xsd。在这个文件中根元素必须是schema。

使用Schema来约束xml,Schema在书写的时候,只需要使用W3C组织提前定义的限定标签的,以及限定的属性的那个标签即可。

4.2 Schema快速入门

第一步:书写xml文件

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

    <book>

        <name>JavaWEB</name>

        <author>老毕</author>

        <price>182</price>

    </book>

    <book>

        <name>SSH</name>

        <author>老于</author>

        <price>152</price>

    </book></books>

 

第二步:定义schema文件

 

在定义Schema文件的时候,由于这个Schema文件本身就是xml,它也要受到别的约束。而这个约束是W3C组织提前定义好的,

在Schema文件中需要提前引入进来在根标签中使用属性进行进入:<schema  xmlns="http://www.w3.org/2001/XMLSchema"   引入W3C定义的schema书写的规范

targetNamespace="http://www.itcast.org/book" 给当前的Schema文件起名字(命名空间)

作用是当哪个xml要引入这个schema约束的时候,必须通过当前targetNamespace 后面书写的uri地址来引入

 

<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema" 

    targetNamespace="http://www.itcast.org/book" 

    elementFormDefault="qualified">

    <element name="books">

        <complexType>

            <sequence>

                <element name="book">

                    <complexType>

                        <sequence>

                            <element name="name"></element>

                            <element name="author"></element>

                            <element name="price"></element>

                        </sequence>

                    </complexType>

                </element>

            </sequence>

        </complexType>

</element>

</schema>

 

第三步:在xml文件中引入当前的这个Schema

<books xmlns="http://www.itcast.org/book"   它是schema文件中的targetNamespace 属性后面的值

        xsi:schemaLocation="http://www.itcast.org/book book.xsd"   这个是在引入当前的schema文件的真实路径

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   说明当前的xml是schema一个实例文档>

 

4.3 Schema的名称空间

在定义Schema文件的时候,需要在<schema>根标签中使用

targetNamespace  属性定义当前schema定义名称(只是一个分配的名字,根本没有指向任何文件),在被约束的xml文件中先根据这个名称引入当前的schema文件,然后在使用

xsi:schemaLocation=””    引入具体的schema文件。(因为targetNamespace属性定义的schema名称,只是一个名称而已,所以在xml文件中需要通过schemaLocation来声明指定所遵循的Schema文件的具体位置)

(xsi:schemaLocation 使用它引入某个schema时,先要使用名称空间, 空格 ,文件名)

 

名称空间主要功能是用于来

elementFormDefault="qualified|unqualified"   

在schema中书写qualified ,在限定xml中的定义的标签名必须使用定义的名称空间。

unqualified 要求根元素必须使用名称空间,而子元素不能使用名称空间。

 

4.4 Schema中的标签解释

Book2.xsd

<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema" 

    targetNamespace="http://www.itcast2.org/book" 

    elementFormDefault="qualified">

    <element name="books">  <!--name代表当前的xml中可以书写标签名称  type数据类型-->

        <complexType ><!-- complexType 当前的element声明的标签是复杂标签时 ,需要使用complexType来声明子标签-->

            <sequence>  <!-- 复杂标签是指有属性,或者有子标签,或者有属性有子标签的标签

                                简单标签是指只有文本内容的标签

                                <name>zhangsan</name>  简单标签

                                <name id="u001"></name>  复杂标签

                                sequence 代表当前子标签的顺序

                            -->

                <element name="book" maxOccurs="unbounded">

                    <complexType mixed="true"><!—mixed属性值为true,book元素间就可以出现字符文本数据了-->

                        <sequence>

                            <element name="name"></element>

                            <element name="author"></element>

                            <element name="price" type="integer"></element>

                            <any></any>

                        </sequence>

                    </complexType>

                </element>

            </sequence>

        </complexType>

</element></schema

 

Name.xsd

<schema xmlns="http://www.w3.org/2001/XMLSchema" 

    targetNamespace="http://www.example.org/name" 

    elementFormDefault="qualified">

    <element name="name"></element></schema>

 

Book2.xml

<?xml version="1.0" encoding="UTF-8"?><aa:books xmlns:aa="http://www.itcast2.org/book"

    xmlns:bb="http://www.example.org/name"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.itcast2.org/book book2.xsd

                        http://www.example.org/name name.xsd"

    >

    <aa:book>

        aa:sjdlkfjlkdsjflk    

        <aa:name >JavaWEB</aa:name>

        <aa:author >老毕</aa:author>

        <aa:price>182</aa:price>

        <bb:name>sdgs</bb:name>

</aa:book></aa:books>

 

School.xsd

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

<schema xmlns="http://www.w3.org/2001/XMLSchema"

    targetNamespace="http://www.example.org/school"

    xmlns:tns="http://www.example.org/school"

    elementFormDefault="qualified">

    <element name="school">

        <complexType>

             <sequence>

                <element maxOccurs="unbounded" minOccurs="1" name="class">

                   <complexType>

                      <attribute name="StudentID" type="ID" use="required"></attribute>

                      <attribute name="Name" type="string"></attribute>

                      <attribute name="Sex">

                          <simpleType>

                             <restriction base="string">

                                 <enumeration value="男"></enumeration>

                                 <enumeration value="女"></enumeration>

                             </restriction>

                         </simpleType>

                     </attribute>

                    <attribute name="Birthday" type="gMonthDay"></attribute>

                  </complexType>

               </element>

            </sequence>

        </complexType>

     </element>

</schema>

 

 

 

10-04 20:35