一、概述
发展历程 |
---|
想当年,浏览器各厂家恶性竞争,导致HTML语言语法松散(不同浏览器,可以让程序员不按语法规则编写页面也能解析),让创造HTML语言的W3C组织很是不开心 |
于是,W3C决定抛弃HTML,创造了语法要求非常严格的XML,XML很大的特性就是可以自定义标签 |
只可惜,程序员们用HTML的无忧无虑十分开心,突然要转回严格模式,愿意的人很少 |
于是XML凉凉,这时W3C决定让XML去更适合它语法特性的地方 |
HTML用来编写页面,展示数据,XML用来存储数据,规定结构,当做配置文件 |
XML的出现为很多现有框架(Spring,MyBatis等)提供了支持,让用户可以配置XML文件来使用这些框架 |
概念 |
---|
1、Extensible Markup Language 可扩展标记语言 |
2、可扩展:标签都是自定义 |
3、功能及使用场景:存储数据(作为配置文件,存储配置信息)、网络传输(作为传输载体,可在网络中进行传输,因为其纯文本特性,可以跨平台传输) |
一、快速入门 及 基本语法(将编写好的文件保存为.xml后缀文件,拖入浏览器后,没有报错即运行成功)
<?xml version='1.0' ?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>20</age>
</user>
<user id='2'>
<name>zhangsan</name>
<age>20</age>
</user>
</users>
一、组成部分
1、文档声明
1)、格式(格式非常严格,多个空格少个空格都不行):<?xml 属性列表 ?>
2)、属性列表<?xml version='1.0' encoding='utf-8' standalong='yes' ?>
* version:版本号(必须指定)
* encoding:规定编码方式(让解析引擎按规定的编码方式解析),默认ISO-8859-1
* standalong:是否独立,规定此xml文件是否会依赖于其它xml文件,'yes'表示此文件独立,'no'表示此文件依赖于其它文件
2、指令(了解即可,因为以前xml做出来是为了取代HTML来展示页面,所以可以编写css文件来控制样式)
<?xml-stylesheet type='text/css' href='a.css' ?>
在上面快速入门基础上,在文档声明下面加上这条指令,然后href规定css文件位置,编写css文件即可
比如:name{color:red}
3、标签
1)、标签名称都是自定义的
2)、标签名命名规则
* 可包含字母、数字以及其它字符
* 不能数字或标点符号开头
* 不能以关键字开头,xml,XML,Xml等都不可以
* 不能包含空格
4、属性
1)、id属性值唯一,其它详细内容会在xml约束讲解
5、特殊字符的原样展示
如果有这样一段内容需要展示:if(a > b && b < c){}
以上内容需要转义成这样(很麻烦) if(a < b && b > c){}
1)、CDATA区:该区域中内容都会原样展示
语法:<![CDATA[ 需要原样展示的数据 ]]>
<![CDATA[
if(a > b && b < c){}
]]>
二、约束
前面讲到 |
---|
XML用于网络传输,存储数据,大量用于充当框架的配置文件 |
那么谁来编写XML,谁来解析XML呢 |
一般配置文件都是使用软件的用户(程序员)来编写,解析由软件(框架)本身完成 |
那么问题来了,XML本身是可以扩展的,用户可以自定义标签,那么框架如何让用户按照自己设计好的标签来写XML文档呢? |
这里就需要使用约束,来让用户按照框架预先定义好的规则,来编写XML文档 |
也就是类似说明书一样的东西,告知用户如何使用框架,让用户按照自己的规矩来编写XML配置文件 |
约束文档 |
---|
限制 用户编写XML文档的语法 |
约束文档由编写框架的人员来规定,使用框架的人需要按照这个规定来编写XML |
一般一些智能的开发工具可以自动读取约束文档,然后给出语法提示 |
想 要使用 约束文档编写XML,需要先引入 作者编写的约束文档 |
分类 |
---|
DTD:简单的约束技术,缺陷较大 |
Schema:复杂约束技术 |
DTD文档示例 |
---|
DTD文档由两种形式,将约束和XML文件写在一起,或者将约束文件专门拿出来存一个.dtd文件,然后引入到XML文档中 |
对于引入外部dtd文件有两种方式,一种是下面使用的通过标签直接引入本地文件,一种是网络的,也是现在大多数框架所使用的方法,那么这里就不说了,因为学习框架的时候会大量使用 |
另外DTD文档具有很大缺陷,比如无法规定字符串内容,比如规定一个age年龄标签,我们不能控制用户将age的取值限制在一个合理范围,比如1-100岁,用户可以写10000,10000000,都不会被dtd文档约束 |
下面只是简单介绍,详细请到https://www.runoob.com/dtd/dtd-tutorial.html |
#####################约束文档###########################
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
######################引入约束文档编写#####################
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<NEWSPAPER>
<ARTICLE AUTHOR='5677'>
<HEADLINE>Tove</HEADLINE>
<BYLINE>Jani</BYLINE>
<LEAD>Reminder</LEAD>
<BODY>Don't forget me this weekend!</BODY>
</ARTICLE>
</NEWSPAPER>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="stringtype">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="inttype">
<xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>
<xs:simpleType name="dectype">
<xs:restriction base="xs:decimal"/>
</xs:simpleType>
<xs:simpleType name="orderidtype">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{6}"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="shiptotype">
<xs:sequence>
<xs:element name="name" type="stringtype"/>
<xs:element name="address" type="stringtype"/>
<xs:element name="city" type="stringtype"/>
<xs:element name="country" type="stringtype"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="itemtype">
<xs:sequence>
<xs:element name="title" type="stringtype"/>
<xs:element name="note" type="stringtype" minOccurs="0"/>
<xs:element name="quantity" type="inttype"/>
<xs:element name="price" type="dectype"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="shipordertype">
<xs:sequence>
<xs:element name="orderperson" type="stringtype"/>
<xs:element name="shipto" type="shiptotype"/>
<xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
</xs:sequence>
<xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>
<xs:element name="shiporder" type="shipordertype"/>
</xs:schema>
#####################以下是引用方法,和上面的代码无关#############
<?xml version="1.0"?>
<note
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
三、解析
解析方法 |
---|
DOM:将标记语言文档一次性加载到内存,在内存中形成一颗DOM树(操作方便(增删改查都十分方便),但是及其消耗内存) |
SAX:逐行读取,基于事件驱动,它会读一行之后立马将内存释放,然后读下一行。(操作复杂,只能读不能写,但是对内存消耗极小) |
那么,每一行都立马释放,怎么知道哪些内容归属于哪些起始标签呢?比如< a >asdfa< a />,它会读完< a >后立即释放,同时触发事件,开启监听器,监视后面的内容属于哪一个起始标签 |
常见解析器 |
---|
JAXP:由sun公司提供的解析器,支持DOM和SAX,效率慢,基本没人用 |
DOM4J:非常优秀,服务器端使用较多的解析器 |
Jsoup:是java的一款HTML解析器,可以直接解析URL地址以及HTML文本内容,提供了一套非常省力的API,可通过DOM,css以及类似于Jquery的操作方法来取出和操作数据 |
PULL:Android操作系统内置的解析器,sax方式的。 |
如果你日后需要开发自己的框架,或者需要获取xml中内容,可以使用某种解析器来完成,比如Jsoup,它有一个jar包,可以在java中使用,极其的简单 |
---|
可以参考Jsoup解析Xml{详解} |