JavaWeb XML

Posted Mr.Aaron

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb XML相关的知识,希望对你有一定的参考价值。

1. XML详解

1.1. XML介绍

1.1.1. 什么是XML

XML的全称为eXtensible Markup Language,译为可扩展标记语言XML语法上和html比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的。

W3C19982月发布1.0版本,20042月又发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在20042W3C又发布了1.0版本的第三版。

1.1.2. 百度百科

xml 即可扩展标记语言。可扩展标记语言,标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

什么是可扩展标记语言?

  • 可扩展标记语言是一种很像超文本标记语言的标记语言。
  • 它的设计宗旨是传输数据,而不是显示数据。
  • 它的标签没有被预定义。您需要自行定义标签。
  • 它被设计为具有自我描述性。
  • 它是W3C的推荐标准。

1.1.3. 维基百科

可扩展标记语言(英语:eXtensible Markup Language,简称: XML),是一种标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用像XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。

1.1.4. 发展历史

XML是从1995年开始有其雏形,并向W3C(万维网联盟)提案,而在1998二月发布为W3C的标准(XML1.0)。XML的前身是SGML(The Standard Generalized Markup Language),是自IBM从1960年代就开始发展的GML(Generalized Markup Language)标准化后的名称。

GML的重要概念:

  • 文件中能够明确的将标示与内容分开
  • 所有文件的标示使用方法均一致

1978年,ANSI将GML加以整理规范,发布成为SGML,1986年起为ISO所采用(ISO 8879),并且被广泛地运用在各种大型的文件计划中,但是SGML是一种非常严谨的文件描述法,导致过于庞大复杂(标准手册就有500多页),难以理解和学习,进而影响其推广与应用。

同时W3C也发现到HTML的问题:

  • 不能解决所有解释数据的问题 - 像是影音档或化学公式、音乐符号等其他形态的内容。
  • 性能问题 - 需要下载整份文件,才能开始对文件做搜索。
  • 扩充性、弹性、易读性均不佳。

为了解决以上问题,专家们使用SGML精简制作,并依照HTML的发展经验,产生出一套使用上规则严谨,但是简单的描述数据语言:XML。

1.1.5. 用途

  • 保存关系型数据
<?xml version="1.0" encoding="UTF-8"?>
<person>
    <name>baidu</name>
    <age>15</age>
</person>
  • 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>app.servlet.MyServlet</servlet-class>
</servlet>

1.2. 第一个XML文件

1.2.1. XML文档声明

  • 文档声明必须为<?xml开头,以?>结束;
  • 文档声明必须从文档的0列位置开始;
  • l 文档声明只有三个属性:
    • versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0
    • encoding:指定当前文档的编码。可选属性,默认值是utf-8
    • standalone:指定文档独立性。可选属性,默认值为yes,表示当前文档是独立文档。如果为no表示当前文档不是独立的文档,会依赖外部文件。

1.2.2. 元素

元素是XML文档中最重要的组成部分:

  • 普通元素的结构:开始标签、元素体、结束标签,例如:<hello>大家好</hello>
    • 开始标签和结束标签:
      • 标签名由字母、数字、下划线(_)、中划线(-)、冒号(:)和点号(.)组成,但不能以数字、中划线和点号开始。
      • 标签名不能包含空格。
      • 标签名中尽量不要出现英文冒号:”。
      • 标签名不能以字符xml”开始。
      • XML命名区分大小写,例如<a><A>是两个不同的元素。
    • 元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a></b>,其中<b>元素的元素体是<a>元素,而<a>元素的元素体是文本;
  • l 空元素:空元素只有开始标签,而没有结束标签。
    • <c/>,当元素必须自己闭合。
    • <c></c>,只由开始标签和结束标签组成

1.2.3. 属性

<?xml version="1.0" encoding="UTF-8"?>
<person id="001">
    <name>baidu</name>
    <age>15</age>
</person>
  • 属性是元素的一部分,它必须出现在元素的开始标签中;
  • 属性的定义格式:属性名=属性值,其中属性值必须使用英文的单引或双引;
  • 一个元素可以有0 - N个属性,但一个元素中不能出现同名属性;

1.2.4. 注释

XML的注释与HTML相同,即以“<!--”开始,以“-->”结束。注释内容会被XML解析器忽略!

<!-- 第一行不能写注释 -->
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这里是注释 -->
<!-- 
    注释也可以这样来书写
 -->
<!-- 
    注释中不能包含"--"
    注释不能以"--->"结束
 -->
<person <!-- 注释不要放在这里 --> >
</person>

注意:

  • 不要把注释放在标签内,这样的XML格式不够好。
  • 不要把注释放在XML声明之前。
  • 不要在注释中使用--”。
  • XML注释不能以“--->”结尾。

1.2.5. 转义字符

XML中的转义字符与HTML一样。

因为很多符号已经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:“<”、“>”、“’”、“””、“&”。

 

例如:<a>&lt;hello&gt;</a><a>元素内部会被解释为:<hello>

1.2.6. CDATA

当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些。

CDATA段中出现的“<”、“>”、“””、“’”、“&”,都无需使用转义字符。这可以提高xml文档的可读性。

<a><![CDATA[<a>]]></a>

注意:在CDATA段中不能包含“]]>”,即CDATA段的结束定界符。

1.2.7. 处理指令

处理指令,简称PIProcessing instruction)。处理指令用来指挥解析器如何解析XML文档内容。

例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析器,应用css文件显示xml文档内容。

<?xml-stylesheet type="text/css" href="a.css"?>

处理指令以<?”开头,以“?>”结束,这一点与xml文档声明相同。

示例:

a.css文件:

gj1 {font-size: 200px; color: red;}
gj2 {font-size: 100px; color: green;}
gj3 {font-size: 10px;}
gj4 {font-size: 50px; color: blue;}

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="a.css" ?>
<gjm>
  <gj1>中国</gj1>
  <gj2>美国</gj2>
  <gj3>日本</gj3>
  <gj4>英国</gj4>
</gjm>

1.2.8. 格式良好的XML文档

格式良好的XML就是格式正确的XML文档,只有XML的格式是良好的,XML解释器才能解释它。下面是对格式良好XML文档的要求:

  • 必须要有XML文档声明;
  • 必须且仅能有一个根元素;
  • 元素和属性的命名必须遵循XML要求;
  • 元素之间必须合理包含,例如:<a><b>xxx</b></a>是合理的,而<a><b>xxx</a></b>就是错误的包含。

2. DTD详解

2.1. DTD介绍

2.1.1. 什么是DTD

DTD的全称为Document Type Definition,译为文档类型定义,用来约束XML文档。

可以把DTD理解为创建XML文档的结构!例如可以用DTD要求XML文档的根元素名为<students><students>中可以有1~N<student><student>子元素为<name><age><sex><student>元素还有number属性。DTD不是XML文档,它是XML文档的约束文件!就像法律与人一样!

2.1.2. 百度百科

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

2.1.3. 维基百科

XML 文件的文件型别定义Document Type Definition)可以看成一个或者多个 XML 文件的模板,在这里可以定义 XML 文件中的元素、元素的属性、元素的排列方式、元素包含的内容等等。

DTDDocument Type Definition)概念缘于 SGML,每一份 SGML 文件,均应有相对应的 DTD。对 XML 文件而言,DTD 并非特别需要,well-formed XML 就不需要有 DTDDTD 有四个组成如下:

  • 元素(Elements
  • 属性(Attribute
  • 实体(Entities
  • 注释(Comments

由于 DTD 限制较多,使用时较不方便,近来已渐被 XML Schema 所取代。

2.2. 引入DTD

2.2.1. 内部DTD

所谓的内部DTD是指将DTDXML数据定义放在同一份文档中。内部DTD紧跟在XML声明和处理指令之后,以“<!DOCTYPE”开始,以“>”结束。其语法格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 根元素名[
    元素描述
]>
XML文档主体部分

示例:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!DOCTYPE person [
    <!ELEMENT person (name, age)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
]>
<person>
    <name>baidu</name>
    <age>15</age>
</person>

2.2.2. 外部DTD

XML文档既可以使用内部DTD,也可以引用外部的DTD。外部DTD的好处是一个DTD文件可以方便地被多个XML文档共享。引入外部DTD的语法格式如下:

<!DOCTYPE 根元素名 SYSTEM "外部DTD的URI">

示例:

DTD文件

<!ELEMENT person (name, age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>

XML文件

<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<!DOCTYPE person SYSTEM "person.dtd">
<person>
    <name>baidu</name>
    <age>15</age>
</person>

2.2.3. 公用DTD

有一种外部DTD是由某个权威机构制定,供特定行业或公众使用,这种DTD又被称为公用DTD。引用公用DTD的格式如下:

<!DOCTYPE 根元素 PUBLIC "DTD的标识名" "公用的DTD的URI">

2.3. 定义元素

2.3.1. 定义元素语法

定义元素的语法:<!ELEMENT 元素名 元素描述>

  • <!ELEMENT person (#PCDATA)>,定义名为person的元素,内容为文本类型。
  • <!ELEMENT person (name,age)>,定义名为person元素,内容依次为nameage元素。
  • <!ELEMENT person ANY>,定义名为person元素,内容任意。
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!DOCTYPE person [
    <!ELEMENT person ANY>
]>
<person>
    <name>baidu</name>
    <age>15</age>
</person>
  • <!ELEMENT person EMPTY>,定义名为student元素,不能有内容,即空元素,注意空元素是可以有属性的。
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!DOCTYPE person [
    <!ELEMENT person EMPTY>
]>
<person />

2.3.2. 有序的子元素

如果使用英文逗号(,)作为子元素之间的分隔符,那么子元素之间必须遵守所定义的顺序。

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!DOCTYPE person [
    <!ELEMENT person (name, qq)>
]>
<person>
    <name>baidu</name>
    <age>15</age>
</person>

2.3.3. 互斥的子元素

互斥的子元素表示一系列子元素之间只能出现其中之一。互斥子元素之间使用竖线(|)分隔。

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!DOCTYPE person [
    <!ELEMENT person (name | age )>
]>
<person>
    <name>baidu</name>
</person>

2.3.4. 子元素出现次数

子元素的出现次数通过在元素声明后紧跟一个表示次数的特殊标记来表示,DTD中表示次数的特殊标记有以下三种:

  •  +:表示子元素可以出现1次或多次。
  •  *:表示子元素可以出现0次或多次。
  •  ?:表示子元素可以出现0次或1次。

2.3.5. 无序的子元素

理论上,DTD没有专门为定义无序的子元素提供语法。如果希望使用DTD来表示某个元素之内接收无序的子元素,怎么办呢?可以利用如下方式实现:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!DOCTYPE person [
    <!ELEMENT person (name | age )+>
]>
<person>
    <age>15</age>
    <name>baidu</name>
</person>

2.4. 定义属性

2.4.1. 定义属性语法

元素除了可以包含子元素之外,还可以添加属性,为XML元素添加属性的格式如下:

<person>
    <name>baidu</name>
</person>

DTD可以定义属性所属的元素、属性类型和属性必须遵守的规则等,DTD中定义属性的语法格式如下:

<!ATTLIST 元素名 属性名 属性类型 [设置说明]>

2.4.2. 定义属性规则

DTD中可以使用多个<!ATTLIST>定义属性,元素对属性的约束规则有如下几种:

  • #REQUIRED:必需的属性,意味着必须为该元素提供该属性。
  • #IMPLIED:该属性是可有可无的。
  • #FIXED:该属性的值是固定的,定义时必须指定固定值。

2.4.3. 定义属性类型

DTD支持的属性类型:

  • CDATA:该属性只能是字符串数据。
  • en1|en2|en3:该属性是一系列枚举值之一。
  • ID:该属性值必须是有效的标识符,且该属性值可用于标识该元素,因而该属性值在此XML文档中必须唯一。
  • IDREF:该属性值必须引用自另一个已有的ID属性值。
  • IDREFS:该属性值必须引用自多个已有的ID属性值,多个ID属性值之间用空格隔开。
  • NMTOKEN:该属性值必须是一个合法的XML名称,它也指定了该属性值是字符串数据,但比CDATA具有更强的约束。
  • NMTOKENS:该属性值可以是多个NMTOKEN,多个NMTOKEN之间用空格隔开。
  • ENTITY:该属性值是一个外部实体,例如图片文件等。
  • ENTITIES:该属性值是多个外部实体,多个实体之间以空格隔开。
  • NOTATION:该属性值是在DTD中声明过的符号(NOTATION)。过期规范,尽量避免使用。
  • xml:该属性值是一个预定义的XML值。

2.5. 定义实体

2.5.1. 什么是实体

有时在XML中会出现很多相同的内容,例如“原来我就是麦兜的QQ空间”,这个名称太长了,我们希望把这个值与一个“符号”绑定,然后在需要这个名称时使用它绑定的“符号”即可。这个符号就是实体了。例如:“&麦兜;”!

其中“麦兜”是实体名,而“原来我就是麦兜的QQ空间”是实体值,XML被解析时,所有实体会被替换成实体名。

2.5.2. 实体分类

实体一般分为两种:一般实体和参数实体。

  • 一般实体:在XML文档中使用;
  • 参数实体:在DTD使用。

2.5.3. 一般实体

一般实体是XML文档里使用的实体,定义普通实体的语法格式如下:

<!ENTTITY 实体名 "实体值">

使用一般实体的语法格式如下:

&实体名;

示例:

DTD文件:

<!ELEMENT person (name, qq, weixin)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT qq (#PCDATA)>
<!ELEMENT weixin (personal, public)>
<!ELEMENT personal (#PCDATA)>
<!ELEMENT public (#PCDATA)>
<!ENTITY jyl "原来我就是麦兜">

XML文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE person SYSTEM "08_person.dtd">
<person>
    <name>&baidu;</name>
    <age>15</age>
</person>

2.5.4. 参数实体

还有一种实体只能在DTD中使用,这种实体被称为参数实体,定义和使用参数实体与普通实体有小小的差别。定义参数实体的语法格式如下:

<!ENTITY % 实体名 "实体值">

DTD中引用参数实体的语法格式如下:

%实体名;

示例:

DTD文件:

<!ELEMENT person (name, age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)><!ELEMENT personal (#PCDATA)>
<!ELEMENT public (#PCDATA)>
<!ENTITY baidu "15">

XML文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE person SYSTEM "08_person.dtd">
<person>
    <name>&baidu;</name>
    <age>15</age>
</person>

3. Schema详解

3.1. Schema介绍

3.1.1. 什么是Schema

XML SchemaDTD的替代者,它采用标准XML语法来定义XML文档语义约束,不仅可以定义XML文档的结构,还可以定义XML文档内容约束。XML Schema也被称为XML Schema定义(XML Schema DefinitionXSD)。

3.1.2. 百度百科

它的作用是定义一份XML文档的合法组件群,就像文档类型定义(外语缩写:DTD)的作用一样,一份XML Schema定义了:

  • 可以出现在文档里的元素;
  • 可以出现在文档里的属性;
  • 哪些元素是子元素;
  • 子元素的顺序;
  • 子元素的数量;
  • 一个元素应是否能包含文本,或应该是空的;
  • 元素和属性的数据类型;
  • 元素和属性的默认值和固定值。

3.1.3. 维基百科

XML Schema因为W3C的推荐,在2001年五月发布,是许多XML schema languages中的一支。它是首先分离于XML本身的纲要语言,故取得W3C的推荐地位。像所有XML纲要语言一样,XML Schema有时用来表达一组纲要──一组XML文件必须遵守的规定,这样根据该纲要才‘合法(Valid)’。然而,不像大部分其他纲要语言一样,XML Schema亦意图设计来确认在一收集来的资料与内附特殊资料型别的结果,它对开发XML文件处理软件有助益,不过同时召来了非议。

3.2. 如何使用Schema

3.2.1. 一个简单的Schema