XML与JSON的简介

一、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结构。因此需要用实体替代字符。

特殊符号实体(替换符号)
<&lt;
>&gt;
&&am;
'&apos;
"&quot;

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

{"firstName": "Json"}

这很容易理解,等价于这条 JavaScript 语句:

1

{firstName : "Json"}

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 少得多,可以大大得节约传输数据所占用的带宽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值