标签:存储 编写 多个 对比 忽略 嵌套 lag 文件名 namespace
XML概念
XML是可扩展标记语言(对比HTML是超文本标记语言)。
主要是用来传输和存储数据,XML的标签没有被预定义,可以自定义标签
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 属性列表 ?>
version
:版本号,是必须要有的属性encoding
:编码方式standalone
:是否独立。yes
:不依赖其他文件;no
:依赖其他文件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的方式:
<!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>
就会出现报错:
schema约束(一种复杂的约束技术)(可以参看https://www.lagou.com/lgeduarticle/17555.html)
xml Schema是基于XML的DTD替代者,后缀名为.xsd
示例:编写personSchema.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,也就是指定未使用任何前缀的元素、数据的命名空间为它.
targetNamespace="http://www.example.org/personSchema"
- 显示被此 schema 定义的元素来自命名空间: http://www.example.org/personSchema
讲解2:
<xs:sequence maxOccurs=‘unbounded‘>
- sequence表示必须按照顺序实现, **maxOccurs=*‘unbounded‘**表示可以有多个相同的,比如上面就是表示persons里可以有多个person.
创建对应的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所约束)
标签:存储 编写 多个 对比 忽略 嵌套 lag 文件名 namespace
原文地址:https://www.cnblogs.com/LucasBlog/p/12571031.html