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:

1<bookstore> 2 <book category="COOKING"> 3 <title lang="en">Everyday Italian</title> 4 <author>Giada De Laurentiis</author> 5 <year>2019</year> 6 <price>30.00</price> 7 </book> 8 <book category="CHILDREN"> 9 <title lang="en">Harry Potter</title> 10 <author>J K. Rowling</author> 11 <year>2005</year> 12 <price>29.99</price> 13 </book> 14 <book category="WEB"> 15 <title lang="en">Learning XML</title> 16 <author>Erik T. Ray</author> 17 <year>2015</year> 18 <price>39.95</price> 19 </book> 20</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>

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

  • 元素

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

1<Person> 2 <Name>Zhang San</Name> 3 <Sex>Male</Sex> 4</Person>

  需要注意的是:

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

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

  • 名字中可以包含字母,数字及其它字母

  • 名字不能以数字或下划线开头

  • 名字不能用xml开头

  • 名字中不能包含空格和冒号

  • 属性

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

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

    <!-- this is comment -->

  需要注意的是:

  • 注释中不要出现“--”或“-”;

  • 注释不要放在标记中;

  • 注释不能嵌套 ;

  • XML中特殊字符的处理

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

<

<

小于

>

>

大于

&

&

和号

'

'

单引号

"

"

引号

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

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

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

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

1HTML: Hello my name is David. 2输出: 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 文档携带着某个表格中的信息:

1<h:table xmlns:h="http://www.w3.org/TR/html4/"> 2   <h:tr> 3   <h:td>Apples</h:td> 4   <h:td>Bananas</h:td> 5   </h:tr> 6</h:table>

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

1<f:table xmlns:f="http://www.w3school.com.cn/furniture"> 2   <f:name>African Coffee Table</f:name> 3   <f:width>80</f:width> 4   <f:length>120</f:length> 5</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:元素类型

  如下面的例子: 

1<?xml version="1.0" encoding="UTF-8" ?> 2<!DOCTYPE bookstore [ 3    <!ELEMENT bookstore (book+)> 4    <!ELEMENT book (bookname,author,price)> 5    <!ATTLIST book id CDATA #REQUIRED> 6    <!ELEMENT bookname (#PCDATA)> 7    <!ELEMENT author (#PCDATA)> 8    <!ELEMENT price (#PCDATA)> 9]> 10<bookstore> 11    <book> 12            <bookname>唐诗</bookname> 13            <author>libai</author> 14            <price>112.00</price> 15    </book> 16    <book> 17            <bookname>降龙十八讲秘籍</bookname> 18            <author>郭芙</author> 19            <price>5</price> 20    </book> 21</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)定义:

1<!ATTLIST 元素名称 2 属性名 属性类型 约束 3 属性名 属性类型 约束 4 ...... 5>

  属性声明举例:

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

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

  属性值类型:

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

  设置说明:

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

  DTD 定义属性示例:

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

  (2) 使用外部DTD验证XML

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

  如下例子:

book.xml:

1<?xml version="1.0" encoding="UTF-8" ?> 2<!DOCTYPE bookstore SYSTEM "bookstore.dtd"> 3    <bookstore> 4    <book> 5            <bookname>带你飞培训教程</bookname> 6            <author>huangjinjin</author> 7            <price>1.00</price> 8    </book> 9    <book> 10            <bookname>降龙十八讲秘籍</bookname> 11            <author>洪七公</author> 12            <price>0.01</price> 13    </book> 14</bookstore>

  bookstore.dtd:

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

  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:

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

  说明:

  2)在XML中引用Schema文档   

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

  说明:

  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中引用这个分组。

1<!--外部定义一个标记--> 2<xs:element name="student"> 3  <xs:complexType> 4    <!--引用分组标记--> 5    <xs:group ref="stuinfo" maxOccurs="unbounded"></xs:group> 6  </xs:complexType> 7</xs:element> 8<!--定义一个分组标记--> 9<xs:group name="stuinfo"> 10  <xs:sequence> 11    <!--自定义的子元素:name和age,name类型为string,age类型为byte,只能出现1--> 12    <xs:element name="name" type="xs:string"></xs:element> 13    <xs:element name="age" type="xs:byte"></xs:element> 14  </xs:sequence> 15</xs:group>

  3)attribute元素:

    用于声明一个属性:

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

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

  示例:属性的用法

  Schema文档: 

1<?xml version="1.0" encoding="UTF-8"?> 2<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 3 <xs:element name="students"> 4 <xs:complexType> 5 <xs:sequence> 6 <xs:element name="student" maxOccurs="unbounded"> 7 <xs:complexType> 8 <xs:attribute name="name" type="xs:string" /> 9 <xs:attribute name="age" type="xs:byte" /> 10 </xs:complexType> 11 </xs:element> 12 </xs:sequence> 13 </xs:complexType> 14 </xs:element> 15</xs:schema>

  XML文档:

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

   4)attributeGroup属性组

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

  Schema文档:

1<!--定义属性组:stuattgroup--> 2<xs:attributeGroup name="stuattgroup"> 3 <xs:attribute name="name" type="xs:string"/> 4 <xs:attribute name="age" type="xs:byte"/> 5</xs:attributeGroup> 6 7<!--引用属性组--> 8<xs:element name="student" maxOccurs="unbounded"> 9 <xs:complexType> 10 <xs:attributeGroup ref="stuattgroup"></xs:attributeGroup> 11 </xs:complexType> 12</xs:element>

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

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

  属性:name

  常用的两种方式:

  1)restriction:约束

    对现有类型进行扩充。

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

1<xs:attributeGroup name="stuattgroup"> 2 <xs:attribute name="name" type="xs:string"/> 3 <!--将原来的xs:int换位age类型--> 4 <xs:attribute name="age" type="age"/> 5</xs:attributeGroup> 6<!--扩展int类型,设置int取值只能是18100,包含18100--> 7<xs:simpleType name="age"> 8 <xs:restriction base="xs:int"> 9 <xs:minInclusive value="18" /> 10 <xs:maxInclusive value="100" /> 11 </xs:restriction> 12</xs:simpleType>

  2)list:列表

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

  Schema文档:

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

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

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

  Schema文档:  

1<?xml version="1.0" encoding="UTF-8"?> 2<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 3 <xs:element name="students"> 4 <xs:complexType> 5 <xs:sequence> 6 <!--通过ref来应用student标记 maxbounded表示不限定出现的次数--> 7 <xs:element ref="student" maxOccurs="unbounded"></xs:element> 8 </xs:sequence> 9 </xs:complexType> 10 </xs:element> 11 12 <!--外部定义一个标记--> 13 <xs:element name="student"> 14 <xs:complexType> 15 <xs:sequence> 16 <!--自定义的子元素:name和age,name类型为string,age类型为byte,只能出现1--> 17 <xs:element name="name" type="xs:string"></xs:element> 18 <xs:element name="age" type="xs:byte"></xs:element> 19 </xs:sequence> 20 </xs:complexType> 21 </xs:element> 22</xs:schema>

  XML文档:

1<?xml version="1.0" encoding="UTF-8"?> 2<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="students.xsd"> 3 <student> 4 <name>张三</name> 5 <age>20</age> 6 </student> 7 <student> 8 <name>李四</name> 9 <age>20</age> 10 </student> 11</students>

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

1) choice

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

  Schema文档:

1<!--设定交通工具只能是自行车,小汽车,摩托车中的一项--> 2<xs:element name="交通工具"> 3 <xs:complexType> 4 <xs:choice> 5 <xs:element name="自行车" type="xs:string"></xs:element> 6 <xs:element name="小汽车" type="xs:string"></xs:element> 7 <xs:element name="摩托车" type="xs:string"></xs:element> 8 </xs:choice> 9 </xs:complexType> 10</xs:element>

  XML文档:

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

  2)sequence

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

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

JSON与XML的区别比较

1.定义介绍(1).XML定义扩展标记语言(ExtensibleMarkupLanguage,XML),用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML使用DTD(documenttypedefinition)文档类型定义来组织数据;格式统一,跨平台和语

PhoneGap设置Icon

参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi

H5中canvas和svg绘图方式介绍

在HTML5中包括了两种绘图方式,canvas和svg(矢量呈现),而与canvas不同的是,svg是一种XML标记语言,它既可以单独保存以“.svg”为后缀的文件在浏览器中打开显示,也支持建立svg标签直接嵌入在网页中显示,还可以通过<embedsrc"文件.svg"name"name自命"type"image/svgxml"height

Unity序列化之XML,JSON

1.先介绍一下XML和JSON是什么东西吧?   (1)XML扩展标记语言(ExtensibleMarkupLanguage,XML),用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML使用DTD(documenttypedefinition

Java高级特性 第12节 XML技术 - HelloWorld