XML基础学习
-
XML概念
XML是可扩展标记语言(对比HTML是超文本标记语言)。
主要是用来传输和存储数据,XML的标签没有被预定义,可以自定义标签
-
XML和HTML区别
- xml的标签都是自定义的,html的标签是预定义的。
- xml的语法严格,html宽松
- xml用于传输和存储数据,html用于显示数据
-
XML结构
XML文档形成了一种树结构,有且只有一个根节点,是所有其他元素的父元素。
以下是一个简单的XML:
<?xml version="1.0" encoding="utf-8" ?> <school> <student> <name>张三</name> <age>18</age> </student> <student> <name>李四</name> <age>25</age> </student> </school>
第一行是XML声明,定义了XML版本(1.0)和使用的编码集(UTF-8)
school是根元素(就比如是解释了这是一个学校)
接下来的student是school的子元素,name和age又是student的子元素,两个student是同级元素。
整个XML的结构可以如下图表示:
-
XML语法
- xml文档后缀名为
.xml
- 所有XML元素都必须关闭标签。(XML声明不算,因为他不是XML元素)
- XML标签对大小写敏感
- XML文档必须有根元素
- XML元素必须正确的嵌套(不能你中有我,我中有你)
- XML的属性值必须有引号(单引号或双引号都可以)
- XML注释:``
- xml文档后缀名为
-
XML文档声明
- 格式:
<?xml 属性列表 ?>
- 属性列表
-
version
:版本号,是必须要有的属性 -
encoding
:编码方式 -
standalone
:是否独立。yes
:不依赖其他文件;no
:依赖其他文件
-
- 格式:
-
XML标签元素
- 命名规则
- 可以包含字母,数字以及其他字符
- 不能以数字或者标点符号开头
- 名字不能以字符xml或者XML,Xml开始
- 名字不能包含空格
- 命名规则
-
XML属性
XML元素可以在开始标签中包含属性(与HTML类似)。
属性用于提供关于元素的额外信息。
XML属性必须加引号(单双引都行)
id属性是唯一的
-
XML文本
所有的XML文档中的文本都会被解析器解析,只有CDATA区段的文本会被解析器忽略。
当某个XML元素被解析时,其标签之间的文本也会被解析。之所以这样子原因是XML元素是可以包含其他元素的,比如以下例子,name标签中包含着另外的两个标签firstName和lastName.
<name><firstName>zhang</firstName><lastName>san</lastName></name>
解析器会把文本解析为子元素,如下:
<name> <firstName>zhang</firstName> <lastName>san</lastName> </name>
CDATA:指的是不应由XML解析器进行解析的文本数据。
在XML中,
<
和&
是非法的,会产生错误,因为XML会去解析,但某些文本,比如JavaScript代码,会包含大量的<
或者&
字符,为了避免错误,可以将代码部分定义为CDATA(XML不会解析,原封不动的展示)CDATA使用格式:
<![CDATA[代码块]]>
<script> <![CDATA[ function fun() { console.log("hello JavaScript"); } ]]> </script>
-
XML约束
因为XML是可扩展的,而且标签时可以自定义的,因此只要满足xml的要求,就可以写出一个xml文件。但是在实际开发中,主要是使用框架,需要给xml引入一些语法,用来检测xml文件是否编写正确。
也就是说,约束其实就是用来规定XML的书写规则的。
(作为框架的使用者,只需要满足能够在xml中引入约束文档以及能够简单的读懂约束文档就行了)。
XML主要有两种类型的约束:
-
DTD约束(一种简单的约束技术)(细节可以参考:https://cloud.tencent.com/developer/article/1019644)
-
引入dtd文档到xml的方式:
- 内部dtd:将约束的规则定义在xml文档中
- 外部dtd:将约束的规则定义在外部的dtd文件中
- 本地文件:
<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置" >
- 网络文件:
<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
- 本地文件:
-
基本语法
<!ELEMENT 元素名 类型>
示例:以一个班级为例子编写dtd文件
class.dtd
<!ELEMENT class (student+)> <!ELEMENT student (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)>
解释:第一行表示根元素为class,并且class里有1个或多个student子元素;
第二行表示student的子元素有name和age;
第三行和第四行表示name和age下都没有子元素,#PCDATA表示可以放任意文本
编写class.xml文件并引入dtd文件
<?xml version="1.0" encoding="utf-8" ?> <!-- 引入dtd,约束该xml--> <!DOCTYPE class SYSTEM "class.dtd"> <class> <student> <name>张三</name> <age>18</age> </student> <student> <name>李四</name> <age>24</age> </student> </class>
以上xml打开是不会报错的,这里借助IE来校验(IE5以上的浏览器内置了XML解析工具),编写以下html
<html> <head> <!--自己编写一个简单的解析工具,去解析XML DTD是否配套--> <script language="javascript"> // 创建xml文档解析器对象 var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); // 开启xml校验 xmldoc.validateOnParse = "true"; // 装载xml文档,即指定校验哪个XML文件 xmldoc.load("class.xml"); document.writeln("错误信息:"+xmldoc.parseError.reason+"<br>"); document.writeln("错误行号:"+xmldoc.parseError.line); </script> </head> <body> </body> </html>
就会出现报错:
dtd.png -
-
-
schema约束(一种复杂的约束技术)(可以参看https://www.lagou.com/lgeduarticle/17555.html)
xml Schema是基于XML的DTD替代者,后缀名为.xsd
示例:编写personSchema.xsd
~~~xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.example.org/personSchema"
targetNamespace="http://www.example.org/personSchema"
elementFormDefault="qualified"> <!--讲解1-->
<xs:element name='persons'> <!--约束xml根元素为persons-->
<xs:complexType> <!--complexType:定义persons为复合元素-->
<xs:sequence maxOccurs='unbounded '> <!--讲解2-->
<xs:element name='person'> <!--约束persons下的子元素名字必须为person-->
<xs:complexType>
<xs:sequence> <!--sequence:必须按照顺序实现:先有姓名,最后年龄.-->
<xs:element name='姓名' type='xs:string' />
<xs:element name='性别' type='xs:string' />
<xs:element name='年龄' type='xs:string' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
~~~
>讲解1:
>
>**xmlns:xs=http://www.w3.org/2001/XMLSchema**
>
>- 约束XML里使用xs:作前缀的元素、属性、类型等名称的变量是属于http://www.w3.org/2001/XMLSchema命名空间的。
>
>**xmlns=[http://www.example.org/personSchema](http://www.example.org/personSchema)**
>
>- 表示默认的命名空间是[*http://www.example.org/personSchema*](http://www.example.org/personSchema),也就是指定未使用任何前缀的元素、数据的命名空间为它.
>
>**targetNamespace="http://www.example.org/personSchema"**
>
>- 显示被此 schema 定义的元素来自命名空间: [*http://www.example.org/personSchema*](http://www.example.org/personSchema)
>
>讲解2:
>
>**<xs:sequence maxOccurs='unbounded'>**
>
>- sequence表示必须按照顺序实现, **maxOccurs=*'unbounded'**表示可以有多个相同的,比如上面就是表示persons里可以有多个person.
创建对应的XML:
~~~xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
1.填写xml文档的根元素
2.引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd文件命名空间. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4.为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.itcast.cn/xml"
-->
<p:persons xmlns:p="http://www.example.org/personSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/personSchema personSchema.xsd ">
<p:person>
<p:姓名>p:张三</p:姓名>
<p:性别>p:男</p:性别>
<p:年龄>p:22</p:年龄>
</p:person>
<p:person>
<p:姓名>p:李四</p:姓名>
<p:性别>p:男</p:性别>
<p:年龄>p:17</p:年龄>
</p:person>
</p:persons>
~~~
>**xmlns:p="http://www.example.org/personSchema"**
>
>- 表明此schema中使用的前缀为p:的元素和数据类型来自于"http://www.example.org/personSchema"名称空间
>
>**xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"**
>
>- 指定定义的XML实例名称空间规范格式.默认都以这个2001版本为使用
>
>**xsi:schemaLocation="http://www.example.org/personSchema personSchema.xsd ">**
>
>- 指定我们使用的"http://www.w3.org/2001/XMLSchema"名称空间的约束格式为personSchema.xsd约束文件的内容(也就是说该xml被personSchema.xsd所约束)