第1章 XML
1.1 概述
XML(EXtensible Markup Language)可扩展的标记语言。主要用于数据交换。在HTML发展过程中,由于游览器厂商的恶性竞争,都在兼容不规范的写法,以用来吸引开发者。这与W3C的初衷相违背。于是W3C制定了XML标准,想以此替代HTML进行数据展示。但此并不能吸引开发者,XML最终以失败告终。XML接着又向数据交互方向寻求生存之路,并在此取得一定的成功。现主要功能用于配置文件跟网络中进行数据交互。
1.2 XML与HTML的区别
- XML标签都是自定义的,HTML标签都是预定义的
- XML的语法严格,HTML语法松散
- XML存储数据的,HTML展示数据的
1.3 语法规则
- XML文件的后缀必须都是xml
- XML第一行必须写文档声明
- XML中有且仅有一个根标签
- 属性值必须使用引号,单引号、双引号都可以
- 标签必须正确关闭,要么成对标签,要么自闭合
- XML区分大小写
1.4 XML组成
1.4.1 文档声明
-
格式:
<?xml 属性列表 ?>
-
属性列表
属性 含义 version 版本号,必须属性 encoding 编码方式,告知解析引擎当前文档使用的字符集,默认ISO-8859-1 standalone 是否独立,取值yes表示不依赖其它文件,取值no表示依赖其它文件 -
栗子
<?xml version="1.0" encoding="UTF-8"?>
1.4.2 指令(了解)
xml中还可以定义指令(CSS),毕竟发明xml的初衷还是做数据展示的。了解即可。
-
demo.xml
<?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/css" href="test.css" ?> <users> <user> <name>张三</name> <age>18</age> <sex>男</sex> </user> <user> <name>李四</name> <age>28</age> <sex>女</sex> </user> </users>
-
test.css
@CHARSET "UTF-8"; name{ color:red; }
1.4.3 标签
xml中还可以自定义标签,有如下规则:
- 名称可以包含字母,数字以及其它字符
- 不能以数字或者标点符号开头
- 名称不能以xml或者XML、Xml等等开始
- 名称不能包含空格
1.4.4 属性
标签内还可以定义属性,主要以K-V对的形式,属性值必须使用引号,单引号、双引号都行。id属性值唯一。
1.4.5 文本
-
标签对中还可以定义文本内容。文本中如果用到需要转义的字符则需要转义,比如:
< (<)
` 、&(&)
、>(>)
。 -
CDATA区中的文本会原样输出,特殊字符不需要转义。
<![CDATA[ ]]>
<code> <![CDATA[ if(a>1 && a<3){ } ]]> </code>
1.4.6 注释
xml中的注释同HTML,<!-- -->
1.5 约束
XML中主要是做数据交互的,那么我们可以通过规则对这些数据进行约束。
1.5.1 分类
XML的约束主要分为dtd跟schema两种。dtd是一种简单的约束技术,已经过时。schema是一种复杂的约束技术,功能更加强大。
1.5.2 DTD的使用
外部DTD
将DTD的约束规则定义在外部的dtd文件中。根据外部的dtd文件的位置又有本地DTD跟网络DTD之分。
-
本地DTD
<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置" >
- student.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE students SYSTEM "student.dtd"> <!-- 外部引入dtd --> <students> <student number="1"> <name>six</name> <age>16</age> <sex>girl</sex> </student> <student number="2"> <name>seven</name> <age>23</age> <sex>boy</sex> </student> </students>
- student.dtd
<!-- 定义可以有标签students,可以有student子标签,*表示数量为0-N, +表示1-N --> <!ELEMENT students (student+) > <!-- 定义有标签student,可以有name,age,sex子标签,需要满足顺序 --> <!ELEMENT student (name,age,sex) > <!-- 定义可以有标签name,类型为字符串--> <!ELEMENT name (#PCDATA) > <!-- 定义可以有标签age,类型为字符串--> <!ELEMENT age (#PCDATA) > <!-- 定义可以有标签sex,类型为字符串--> <!ELEMENT sex (#PCDATA) > <!-- 定义student标签可以有属性number,必填项--> <!ATTLIST student number ID #REQUIRED >
-
网络DTD
<!DOCTYPE 根标签名 PUBLIC "dtd文件名" "dtd文件的位置URL" >
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
内部DTD
DTD的约束还可以直接定义在xml文件中。<!DOCTYPE students [ ]>
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 内部dtd -->
<!DOCTYPE students [
<!ELEMENT students (student+) >
<!ELEMENT student (name,age,sex) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA) >
<!ELEMENT sex (#PCDATA) >
<!ATTLIST student number ID #REQUIRED >
]>
<students>
<student number="1">
<name>six</name>
<age>16</age>
<sex>girl</sex>
</student>
<student number="2">
<name>seven</name>
<age>23</age>
<sex>boy</sex>
</student>
</students>
1.5.3 schema
由于DTD不能对数据内容进行约束,我们可以使用另一种功能更加强大的技术:schema。
schema的导入
我们先看一个简单的使用schema的规则(student.xml)
<?xml version="1.0" encoding="UTF-8"?>
<a:students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:a="http://www.blb.com/xml"
xsi:schemaLocation="http://www.blb.com/xml student.xsd"
>
<a:student number="blb_0001">
<a:name>six</a:name