第2章 XML语法
XML被设计用来描述数据,其重点是数据的内容;而HTML被设计用来显示数据,其重点是数据的样式。在未来的Web开发中XML将会无所不在。在本章将详细介绍XML的基础语法知识,为以后的学习打下坚实的基础。
本章知识要点:
熟练掌握XML文件的基本结构
掌握XML文档元素的使用
理解CDATA段的作用
理解XML命名空间的作用
掌握XML元素内容与属性的差异
2.1 XML文档结构
XML是一种为各种领域应用而设计的元标记语言。每个XML应用程序都有自身的语法和词汇,但这些语法和词汇都必须服从XML的基本语法规则。在本节将介绍XML文件的整体结构。
2.1.1 XML文档组成与声明
XML文档由声明、元素、注释、字符引用和处理指令组成。在文档中,所有这些XML文档的组成部分都是通过元素标记来指明的。XML元素标记包括开始标记,结束标记、空标记、实体引用、字符引用、注释、CDATA段定界符、文档类型声明、处理指令(XML声明也是处理指令)、文本声明以及空白。
2.1.2 XML文档注释
通过使用注释标记在XML文档添加附加信息以便阅读和理解文档。适当的注释可以提高文档的阅读性尽管XML解析器通常会忽略文档中的注释,但位置适当且有意义的注释可以大大提高文档的可读性。所以XML文档中不用于描述数据的内容都可以包含在注释中,注释以“<!--”开始,以“-->”结束,在起始符和结束符之间为注释内容,注释内容可以输入符合注释规则的任何字符串。
2.2 XML文档元素
XML元素是XML文档的主体,它被用来容纳和组织数据。本节将向读者详细介绍元素相关知识,以及如何使用元素构建创建规范的XML文档。
2.2.1 元素介绍
元素标识命名的信息节,并使用标记构建标识元素的名称、开始和结束。元素还可以包含属性名称和值,用于提供有关内容的其他信息,并指出了这些信息的逻辑结构。
2.2.2 XML元素综合实例
在本节通过下面实例介绍如何定义元素以及如何使用元素。
2.2.3 XML元素属性
在有些情况下,可能要将某些额外的说明信息加于元素上,而这些信息与元素本身包含的信息内容又有所不同,那么该如何办呢?元素的属性可以很方便的解决此类问题。在本节将介绍有关元素属性方面的知识。
2.3 CDATA段
在XML文档中,所有文本将被解释器进行解析,而左尖括号“<”、右尖括号“>”、连接符号“&”、单引号“'”或双引号“"”等符号被作为特定的用途来使用而不能直接在XML文档中使用。如果需要在XML文档内使用这些特殊符号或显示某些文本内容时,该如何办呢?在本节将通过实体引用和对CDATA段的学习来解决。
2.3.1 特殊字符使用
在XML文档中,开始和结束标记之间出现的所有合法字符都被有效地传给XML处理程序。如果在文本中使用了单引号等特殊字符,那么解析器将会出现错误。为了避免把字符数据和标记中需要用到的一些特殊符号相混淆,XML还提供了一些实体引用。实体引用的作用是:当在字符数据中需要使用这些特殊符号时,可以使用实体引用来代替这些特殊符号。实体必须以符号“&”开头,以符号“;”结尾。
实体引用
|
特殊字符
|
意义
|
<
|
<
|
小于号
|
>
|
>
|
大于号
|
&
|
&
|
和或连接符
|
'
|
'
|
单引号
|
"
|
"
|
双引号
|
2.3.2 CDATA格式
CDATA段以“<![CDATA[”作为段的开始,以“]]>”作为段的结束,段开始和段结束之间的内容称为CDATA段的内容。解析器不对CDATA段的内容做分析处理,因此,CDATA段中的内容可以包含任意字符。W3C规定,CDATA段中不可以嵌套另一个CDATA段。
<?xml version="1.0" encoding="utf-8" ?>
<root>
<script>
<![CDATA[
var iFirst = 3;
var iSecond = 4;
var result = 0;
if ( iFirst > iSecond )
result = iFirst - iSecond;
if (iFirst < iSecond )
result = iFirst * iSecond;
else
result = iFirst & iSecond;
alert("<br>");
]]>
</script >
</root>
2.3.3 CDATA位置
在XML文档中,只能在根元素中文本内容中使用CDATA段。在XML标记中则不能使用CDATA段,否则出现解释错误,CDATA段也不能出现在其他非文本内容的文档元素中。
<?xml version="1.0" encoding="utf-8"?>
<root>
<![CDATA[
这是第一个CDATA段
]]>
</root>
2.4 XML命名空间
由于XML允许自定义标记,因此XML文件中就有可能出现重名标记。如果需要区分这些标记,那么使用命名空间就可以区分重名标记。命名空间的目的是有效地区分名字相同的标记。在本节将介绍命名空间的有关知识。
2.4.1 命名空间概念
命名空间是XML文档的基本成分,是确保元素唯一性的限定名称。例如,可以将一个班的学生姓名作为一个命名空间,也可以把一组学生的姓名作为一个命名空间。命名空间就是在逻辑上相关的任何一组名称,而且在同一命名空间中的元素名称必须具有惟一性。通过XML命名空间,我们可以区分来自不同的XML应用的具有相同名称的元素和属性。
2.4.2 定义命名空间
命名空间是通过使用一系列保留属性进行声明。这一系列保留属性的名称必须是xmlns或以“xmlns:”作为前缀。与其它任何XML属性一样,这些属性可以直接或缺省方式给定。
<?xml version="1.0" encoding="utf-8"?>
<books xmlns:subject=http://www.itzcn.com/xmlns-booksubject xmlns:content="urn:xml_book:bookcontent">
<subject:book bookname="Oracle DBA快速入门">
<subject:description>从零基础开始学习Oracle DBA知识,30天可以系统掌握DBA知识</subject:description>
</subject:book>
<content:book bookname="XML基础教程">
<content:description>讲述XML基本知识的入门级教程</content:description>
<content:page>460 pages</content:page>
</content:book>
</books>
2.4.3 默认命名空间
在默认命名空间中,可以把标记名称作为元素名称,而不必显式使用命名空间前缀。默认命名空间就是一个没有命名空间属性前缀的XML命名空间声明,其作用域应用于声明此默认命名空间的元素,以及在该元素之下嵌套的无前缀元素,其主要目的就是缩短使用命名空间的XML文档。
<?xml version="1.0" encoding="utf-8"?>
<books xmlns=http://www.itzcn.com xmlns:subject="http://www.itzcn.com/xmlns-booksubject">
<subject:book bookname="Java高级编程">
<subject:description>讲述Java程序开发的高级知识</subject:description>
</subject:book>
<book bookname="ASP.net基础入门">
<description>讲述ASP.net编程基础知识</description>
<price>83.6RMB</price>
<page>800 pages</page>
</book>
</books>
2.5 格式良好XML文档
格式良好的XML是遵循 XML文档基本语法规则的XML文档。这些规则规定了元素和元素内容之间的关系、如何按层次嵌套元素以及如何自定义元素和属性等准则。在本节将介绍如何创建格式良好的XML文档。
2.5.1 创建格式良好XML文档
创建XML文档时,必须遵循一些基本的指导原则,这样创建出的文档才是“格式良好的”。格式良好的XML文档表示XML元素遵循XML文档的基本规则。
2.5.2 有效XML文档
每一份XML文档都必须是格式良好的。这意味着XML文档必须符合XML语法规则的最小集合。如果XML文档格式不正确,那么它不能被视为XML文件。一个有效的XML文档一定是格式良好的XML文档,而格式良好的XML文件不一定是有效的XML文档。但符合另两项额外要求时,一个格式良好的XML文件符合下面两项要求时,才可以成为是一个有效的XML文档。
books
<?xml version="1.0" encoding="gb2312" ?>
<books xmlns:people="http://www.itzcn.com/book_XML">
<book>
<title>JSP高级编程</title>
<author>
<people:name>张武</people:name>
<people:title>作家</people:title>
</author>
</book>
<book>
<title>XML入门到精通</title>
<author>
<people:name>李斯</people:name>
<people:title>教师</people:title>
</author>
</book>
</books>
car
<?xml version="1.0" encoding="gb2312"?>
<cars>
<car maker="长安福特" price="77万¥">
<type>福特E-250豪华商务版</type>
<oil_wear>5.8-6.1 升/百公里 </oil_wear>
<discharge>1798-1999 cc</discharge>
<load>7座</load>
<Max_mph>待查</Max_mph>
</car>
<car maker="长安福特" price="12.38万¥">
<type>福克斯两厢 1.8MT舒适型</type>
<oil_wear> 5.8 升/百公里</oil_wear>
<discharge>1798-1999 cc</discharge>
<load>5座</load>
<Max_mph>195.0 km/h</Max_mph>
</car>
</cars>
char
<?xml version="1.0" encoding="gb2312" ?>
<program>
<desc>计算前index个自然数的和。如果参数index<1,那么返回整数0.</desc>
<method>
<![CDATA[
int add(int index)
{
if (index < 1)
{
return 0;
}
int sum = 0;
index++;
for (int i = 1; i < index; i++)
{
sum += i;
}
return sum;
}
]]>
</method>
</program>
score
<?xml version="1.0" encoding="gb2312"?>
<class id="301" desc="三年级一班">
<student id="30101">
<mark type="语文">91</mark>
<mark type="数学">98</mark>
<mark type="英语">95</mark>
</student>
<student id="30102">
<mark type="语文">68</mark>
<mark type="数学">97</mark>
<mark type="英语">90</mark>
</student>
<student id="30103">
<mark type="语文">86</mark>
<mark type="数学">89</mark>
<mark type="英语">68</mark>
</student>
<student id="30104">
<mark type="语文">88</mark>
<mark type="数学">92</mark>
<mark type="英语">78</mark>
</student>
<student id="30105">
<mark type="语文">89</mark>
<mark type="数学">96</mark>
<mark type="英语">90</mark>
</student>
</class>
book
<?xml version="1.0" ?>
<book>
<!-- 解决字符不识别常用方法有两种:
1、把XML文档另存为utf-8编码格式,覆盖掉原来的XML文档。
2、把XML文档的编码方式与操作系统默认编码方式相兼容。
-->
<name>XML基础教程</name>
<desc>针对XML初学者,详细介绍XML基本概念和技术。</desc>
<author>耿祥义</author>
<publisher>清华大学出版社</publisher>
<price unit="人民币元">21.00</price>
</book>
class
<?xml version="1.0" encoding="utf-8"?>
<class>
<!-- teacher元素中的一个属性值是单引号和双引号的混合体 -->
<desc>新野科技大学信息管理系08届八班第一排学生信息</desc>
<students>
<student id="010803" name="吴潘" sex="女" ></student>
<student id="010801" name="王岚均" sex="女" ></student>
<student id="010802" name="李俢" sex="男" ></student>
<student id="010810" name="赵方" sex="男" ></student>
<student id="010804" name="张天然" sex="男" ></student>
</students>
<teacher name="史政来" teaching="语文’/>
</class>
2-1
<?xml version="1.0" encoding="gb2312"?>
<张丽>
<电话>010-58102101</电话>
<地址>北京市海淀区明天花园3033号 </地址>
</张丽>
gb2312
<?xml version="1.0" encoding="gb2312" ?>
<class id="5" name="五年级" >
<room id="501">
<name>五年级一班</name>
</room>
<room id="502">
<name>五年二班</name>
</room>
</class>
simple
<?xml version="1.0" encoding="utf-8" ?>
<school xmlns:wu="http://www.itzcn.com/xmlns-wu">
<wu:class id="5" name="五年级" >
<wu:encoding >
<wu:desc>
文件默认被保存为操作系统的编码方式,所以encoding属性值与xml文件编码方式要一致,否则不识别中文或者提示只支持转换
encoding="gb2312"对应保存为ANSI编码的文件
</wu:desc>
</wu:encoding>
<wu:room id="501">
<wu:name>五年级一班</wu:name>
</wu:room>
<wu:room id="502">
<wu:name>五年二班</wu:name>
</wu:room>
</wu:class>
</school>
element
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE program[
<!ELEMENT program (java,c,vb,copyright)>
<!ELEMENT java (#PCDATA)>
<!ELEMENT c (#PCDATA)>
<!ELEMENT vb EMPTY>
<!ELEMENT copyright (#PCDATA)>
<!ENTITY copyright "©2008,IT在中国" >
]>
<!--这是一个program文档 -->
<program>
<java>
<![CDATA[
if (a > b && c < b)
max = a;
]]>
</java>
<c>
if (a < c)
max = c;
</c>
<vb/>
<copyright>©right;</copyright>
</program>
note
<?xml version="1.0" encoding="utf-8" ?>
<!--配置Beans -->
<beans>
<!--定义一个Bean -->
<bean id="helloworld" class="com.itzcn.HelloWorld">
<!-- 通过setContent方法注入一个字符串值-->
<property name="content">
<value>你好,这是第一个程序</value>
</property>
</bean>
<!--this is a bad- - document.- --do you know! -->
</beans>
extend
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>
<name>XML基础教程</name>
<price>36.6</price>
<isbn>7-302-12501-0</isbn>
</book>
</books>
school
<?xml version="1.0" encoding="utf-8"?>
<school name="启明培训学校">
<grade id="1" name="一年级">
<class id="101" name="一班">
<teachers >
<teacher teach="语文">王军</teacher>
<teacher teach="数学">周杰</teacher>
</teachers>
<students >
<student id="10101">
<name>胡艳</name>
<sex>女</sex>
</student>
<student id="10102">
<name>田镇南</name>
<sex>男</sex>
</student>
<student id="10103">
<name>刘嘉</name>
<sex>女</sex>
</student>
</students>
</class>
</grade>
<grade id="2" name="二年级">
<class id="201" name="一班">
<teachers >
<teacher teach="语文">胡军</teacher>
<teacher teach="数学">王洁</teacher>
</teachers>
<students >
<student id="20101">
<name></name>
<sex>女</sex>
</student>
<student id="20102">
<name>田镇海</name>
<sex>男</sex>
</student>
<student id="20103">
<name>刘丽</name>
<sex>女</sex>
</student>
</students>
</class>
</grade>
<xml>sdf</xml>
</school>
simple
<?xml version="1.0" encoding="gb2312" ?>
<通讯录>
<!--"记录"标记中可以包含姓名、地址、电话和电子邮件 -->
<记录 date="2008/3/9">
<姓名>李军</姓名>
<地址>浙江省杭州市滨河大道36号</地址>
<电话>0571-12345678</电话>
<电子邮件>evan@tom.com</电子邮件>
</记录>
<记录 date="2008/3/10">
<姓名>黄慧</姓名>
<地址>黑龙江省哈尔滨市工农大道2号</地址>
<电话>0451-83365354</电话>
</记录>
<记录 date="2008/3/10">
<姓名>闫阳</姓名>
<地址>吉林省长春市幸福路6号</地址>
<电话>0431-8365257</电话>
<电子邮件>yanyang@sina.com</电子邮件>
</记录>
</通讯录>
program
<?xml version="1.0" encoding="utf-8" ?>
<Program>
<Script>
if (a < b)max = b;
</Script>
</Program>
student
<?xml version="1.0" encoding="utf-8"?>
<students>
<student name="王军" sex="男" age="20">班长</student>
<student name="李霞" sex="女" age="19">团支书</student>
<student name="陈财" sex="男" age="20">学生</student>
</students>
1-6
<?xml version="1.0" encoding="utf-8" ?>
<!--文档根元素beans -->
<beans>
<!--配置一个Bean -->
<bean id="reader" class="com.itzcn.FileReader">
<!--setter注入 -->
<property name="file">
<value>d:\\temp\\beans.xml</value>
</property>
</bean>
</beans>
1-60
<!--XML处理指令 -->
<?xml version="1.0" encoding="utf-8"?>
<simple></simple>
1-61
<?xml version="1.0" encoding="utf-8"?>
<student>
<name id="012301">Kate</name>
<student>
<student>
<name id="012302">Tom</name>
</student>
test
<?xml version="1.0" encoding="utf-8" ?>
<students>
<student>
<name>张三</name>
<age>20</age>
</student>
</students>