XML快速入门

一、概述

发展历程
想当年,浏览器各厂家恶性竞争,导致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后缀文件,拖入浏览器后,没有报错即运行成功)
	<?xml version='1.0' ?>  <!--文档声明,XML第一行必须是这个(必须是第一行,上面不能有空行),version属性规定版本-->
	<users><!--自定义标签,这里作为一个根标签,代表存储多个用户,注意:每个XML文档只能有一个根标签-->
		<user id='1'><!--自定义标签,这里作为一个单个用户,id为1,这里的id是一个属性,属性值是1,注意:属性值必须用引号引起来,单双引号都可以-->
			<name>zhangsan</name><!--自定义标签,这里作为一个用户属性,姓名-->
			<age>20</age>
		</user><!--每个标签必须一一对应一个结束标签,</标签名>就是同名标签的结束标签-->
		
		<user id='2'>
			<name>zhangsan</name>
			<age>20</age>
		</user>
	</users><!--注意!!!XML的标签名严格区分大小写-->
一、组成部分
	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 &lt; b &amp;&amp; b &gt; 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
#####################约束文档###########################
<!--<!DOCTYPE NEWSPAPER [            这一行是内部(就是和XML文件写一起)约束编写时需要添加的       -->

<!ELEMENT NEWSPAPER (ARTICLE+)><!--定义一个根标签NEWSPAPER,里面可以有多个ARTICLE标签,最少1个-->
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)><!--定义一个标签ARTICLE,里面可以跟HEADLINE或者BYLINE等子标签,每个只能出现一次,如果要规定次数需要加*等符号约束-->
<!ELEMENT HEADLINE (#PCDATA)><!--约束标签,#PCDATA表示此标签的标签体中只能出现普通字符串-->
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)> 

<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED><!--约束属性,给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"><!--引入上面的文档,这里我将dtd文档放在了相同目录下起名为note.dtd-->
<!--
	引入语法
		本地:<!DOCTYPE 根标签名 SYSTEM "约束文档路径">
		网络:<!DOCTYPE 根标签名 PUBLIC "随便起一个dtd文件名" "约束文档url路径:http://......">
-->
<NEWSPAPER>
	<ARTICLE AUTHOR='5677'>
	  <HEADLINE>Tove</HEADLINE>
	  <BYLINE>Jani</BYLINE>
	  <LEAD>Reminder</LEAD>
	  <BODY>Don't forget me this weekend!</BODY>
	</ARTICLE>
</NEWSPAPER>
XML Schema 示例
下面只是举例,因为比较复杂就不讲解了,你只需要知道,和dtd差不多,只不过可以约束的更细节,约束范围更大。详细请到https://www.runoob.com/schema/schema-tutorial.html
<?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"  为每一个xsd约束声明一个前缀作为标识(这里是个容易混淆的点,如果你
这样写,xmlns:a="http://www.w3schools.com".那么,你接下来编写的xml文档的每一个标签都得加a:前缀,比如:
<a:note>,而xmlns="http://www.w3schools.com"这样写,没有指定前缀,将会使用默认前缀,也就是什么都不用写)
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  引入xsi前缀,固定格式,这里使用的是w3c提供的2001版本约束
xsi:schemaLocation="http://www.w3schools.com note.xsd"> 引入xsd文件命名空间
-->
<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{详解}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值