一、XML
1.XML的概述
XML,全名为 Extensible Markup Language,可扩展标记语言。可以用于标记数据,定义数据类型,对文档和数据进行结构化处理,是一种允许用户自定义标记的源语言。它的设计宗旨是存储和传输数据,非常适合万维网传输数据。
又因为XML没有预定义任何标记,所有标记都是用户自定义和命名的,在用户之间不是很方便,不规范。因此,W3C组织又定义了一些约束文档,这些约束文档就专门用来约束当前这个xml中能够书写的具体的标签以及属性等信息。
2.与HTML的比较
- xml是可扩展标记语言,html是超文本标记语言(Hypertext Markup Language)
- xml语法严格,html语法松散,
- xml做数据存储和传输,html做页面展示,
- xml所有标签都是自定义的,html所有标签都是预定义的,
3.XML语法
3.1 文档声明
用于规定当前的XML类型
语法:<?xml ?>
位置:必须放置于文档的首行。
属性:version、encoding、standalone<?xml version=”1.0” encoding=”编码表” standalone=”yes|no” ?>
例如:
<?xml version=”1.0” encoding=”UTF-8” ?>
3.2 元素
元素,也就是xml中的标签。
- xml中的标签分成单标签和双标签、在xml所有的标签必须闭合。
- xml中的标签大小写敏感。
- xml中的标签可以嵌套,但是不能交差嵌套。
- xml的标签只能有一个根标签。
- 标签不能以数字开始,不建议以下划线开始,同时在标签名中不要使用冒号。
- 标签名可以是中文,但是一定指定能够识别中文的码表。但不建议书写中文。
<book>
<name></name>
<price></price>
</book>
3.3 属性
- 属性必须写在开始标记中
- 属性是由key和alue值组成,属性和值之间使用=连接
- 属性值可以使用单引号也可以使用双引号。
- 另外:在xml技术中,标签属性所代表的信息,也可以改为用子元素的形式来描述,如:<input><type>text</type></input>
3.4 注释
- <!-- 注释内容 -->
- 注释不能加在文档声明前。
3.5 特殊字符
在xml的文本数据中可能会遇到一些特殊字符,破坏xml结构。因此需要用实体替代字符。
特殊符号 实体(替换符号) < < > > & &am; ' ' " "
3.6 文本域
<![CDATA[ 文本信息 ]]>
文本域中的信息,都被当做普通字符,即使有特殊字符,也当做普通字符
4.约束
由于xml的标签由用户自己定义,因此在开发的时候,每个人都可以根据自己的需求来定义xml标签,这样导致项目中的xml难以维护,因此需要使用一定的规范机制来约束xml文件中的标签书写。
4.1 DTD约束
DTD用来约束xml文件,可以直接定义在xml中,也可以单独写在扩展名为DTD的本地文件中并引用,也可以在xml中引入第三方的公共DTD。
第一种:直接定义在xml中
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE #写在<!DOCTYPE >内部
books[ #根标记
<!ELEMENT books (book*)> #books的子标记book可以有0到多个
<!ELEMENT book (name,author,price,desc)> #book有四个子标记,书写时必须按照此定义顺序
<!ELEMENT name (#PCDATA)> #name下不能有子标记,只能是字符串
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT desc (#PCDATA)>
<!ATTLIST book id CDATA #REQUIRED> #book标记中定义id属性,值为字符串,是必须的
<!ATTLIST name time CDATA #IMPLIED> #name标记中定义time属性,值为字符串,是不必须的
]>
<books>
<book id="1001">
<name>天龙八部</name>
<author>金庸</author>
<price>23</price>
<desc>比较好看</desc>
</book>
</books>
第二种:引用本地系统的DTD文件
1.在本地系统任意地方创建扩展名为DTD的文件,如:D:/dir/test.dtd
2.打开test.dtd,编写DTD语法
<?xml version="1.0" encoding="utf-8"?> #必须要有文档声明
<!ELEMENT books (book*)> #较第一种方式 没有<!DOCTYPE >
<!ELEMENT book (name,author,price,desc)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT desc (#PCDATA)>
3.在当前的xml中引用DTD文件
引用方式:<!DOCTYPE 根标记 SYSTEM "URL">
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE books SYSTEM "D:/dir/test.dtd"> #引用方式 第二个参数是根标记,第四个为路径
<books>
<book>
<name>天龙八部</name>
<author>金庸</author>
<price>23</price>
<desc>比较好看</desc>
</book>
</books>
第三种:引用网络上的公共的DTD文件
4.2 Schema约束
因为DTD在约束xml的时候,一个xml中只能引入一个DTD,同时DTD无法对属性以及标签中的数据做数据类型的限定。所以W3C组织又定义Schema来代替DTD来约束xml。
- Schema文件本身就是使用xml文件书写的,同时它对需要约束的xml中的数据有严格的限定。
- Schema中去约束xml的标签以及属性,还有属性的数据类型,以及标签中子标签的顺序。
- Schema文件的扩展名必须是.xsd。
- 在这个文件中根元素必须是schema。
1.编写schema文档
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" #必须引入W3C约束
targetNamespace="http://www.test.org/book" #自定义一个命名空间,作为区分其他Schema文档
elementFormDefault="qualified"> #固定写法
<element name="books"> #根标记
<complexType>
<sequence>
<element name="book" maxOccurs="unbounded"> #子标记
<complexType>
<sequence> #子标记顺序
<element name="name" type="string"></element>
<element name="author" type="string"></element>
<element name="price" type="double"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
2.编写当前xml文件
<?xml version="1.0" encoding="UTF-8"?>
<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" #表示当前xml是一个实例
xmlns="http://www.test.org/book" #它是schema文件中的targetNamespace 属性后面的值
xsi:schemaLocation="http://www.test.org/book book.xsd"> #这个是引入的schema的命名空间和schema文件的真实路径
<book>
<name>雪中悍刀行</name>
<author>烽火戏诸侯</author>
<price>18</price>
</book>
<book>
<name>琅琊榜</name>
<author>海晏</author>
<price>15.8</price>
</book>
</books>
二、JSON
1. json的简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。
JSON是Douglas Crockford在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式,雅虎和谷歌就在那时候开始广泛地使用JSON格式。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
2. json与js对象的关系
有多数人,都搞不清楚 JSON 和 JS 对象的关系,迷惑很久。其实,我们可以这么理解:JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
var
json = '
{"username":"Hello","age":"23"}'
;
//这是一个 JSON 字符串,本质是一个字符串var
obj = {username:
'Hello'
,age:
'23'}; //这是一个对象,注意键名也是可以使用引号包裹的
JSON 和 JS 对象互转
要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:
var
obj = JSON.parse(
'{"username":"Hello", "age":"23"}'
);
//结果是 {username: 'Hello', age:'23'}
要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:
var
json = JSON.stringify({username:
'Hello'
, age:
'23'
});
//结果是 '{"username":"Hello","age":"23"}'
3. json语法
JSON 语法规则
在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:
- 对象表示为键值对
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON 键/值对
JSON 键值对是用来保存 JS 对象的一种方式,和 JS 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 "" 包裹,使用冒号 : 分隔,然后紧接着值:
1 |
|
这很容易理解,等价于这条 JavaScript 语句:
1 |
|
4.案例演示
json可以将 js对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式,例如在 java 中,可以将 JSON 还原为数组或者一个基本对象。在用到AJAX时,如果需要用到数组传值,这时就需要用JSON将数组转化为字符串。
》json表示对象
JSON最常用的格式是对象的 键值对。例如下面这样:
'{"firstName": "Brett", "lastName": "McLaughlin"}'
》表示数组
和普通的 JS 数组一样,JSON 表示数组的方式也是使用方括号 []。
'{"people":[{"firstName": "Brett","lastName":"McLaughlin"},{"firstName":"Jason","lastName":"Hunter"}]}'
在处理 JSON 格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,也可以使用不同方式表示同一事物。这不难理解。在这个示例中,只有一个名为 people的变量,值是包含两个条目的数组,每个条目是一个人的记录,其中包含名和姓。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示更过多的值(每个值包含多个记录)。
如前面所说,除了对象和数组,你也可以简单地使用字符串或者数字等来存储简单的数据,但这样并没有多大意义。
5.和XML的比较
可读性
JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。
可扩展性
XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。
编码难度
XML有丰富的编码工具,比如Dom4j、Dom、SAX等,JSON也有提供的工具。无工具的情况下,相信熟练的开发人员一样能很快的写出想要的xml文档和JSON字符串,不过,xml文档要多很多结构上的字符。
实例比较
XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。
用XML表示中国部分省市数据如下:
<?xml version="1.0" encoding="utf-8"?>
<country>
<name>中国</name>
<province>
<name>黑龙江</name>
<cities>
<city>哈尔滨</city>
<city>大庆</city>
</cities>
</province>
<province>
<name>广东</name>
<cities>
<city>广州</city>
<city>深圳</city>
<city>珠海</city>
</cities>
</province>
<province>
<name>台湾</name>
<cities>
<city>台北</city>
<city>高雄</city>
</cities>
</province>
<province>
<name>新疆</name>
<cities>
<city>乌鲁木齐</city>
</cities>
</province>
</country>
{
"name": "中国",
"province": [{
"name": "黑龙江",
"cities": {
"city": ["哈尔滨", "大庆"]
}
}, {
"name": "广东",
"cities": {
"city": ["广州", "深圳", "珠海"]
}
}, {
"name": "台湾",
"cities": {
"city": ["台北", "高雄"]
}
}, {
"name": "新疆",
"cities": {
"city": ["乌鲁木齐"]
}
}]
}
可以看到,JSON 简单的语法格式和清晰的层次结构明显要比 XML 容易阅读,并且在数据交换方面,由于 JSON 所使用的字符要比 XML 少得多,可以大大得节约传输数据所占用的带宽。