XML概述 XML概述 XML的歷史背景 XML的歷史背景 GML(1969):通用標記語言 IBM公司的一些專家們一起研究的一個課題: 軟體必須有高度的可移植性,而且必須有一個統一的標準。為了實現軟體的一處編寫多處運行這個願景所誕生。 SGML(1985):專家們對GML升級,標準的通用標記語言。 ...
-
XML概述
-
XML的歷史背景
GML(1969):通用標記語言
IBM公司的一些專家們一起研究的一個課題:
軟體必須有高度的可移植性,而且必須有一個統一的標準。為了實現軟體的一處編寫多處運行這個願景所誕生。
SGML(1985):專家們對GML升級,標準的通用標記語言。SGML廣泛的應用於工業領域。
HTML(1993):由W3C組織推廣,超文本標記語言。HTM誕生願景:跨平臺,跨設備,跨瀏覽器打開同一個網頁所展示的效果是一致的。
XML(1998):由W3C組織推廣,最初誕生的目的:為了替代HTML。但是在其他方面得到了很好的發展:在數據的傳輸方面得到很好的發展。
面試題:什麼是XML?其主要功能是什麼?
答:XML是可拓展的標記語言,其主要功能是用於數據的傳輸和數據的存儲。
-
認識XML
英文全稱:extensible markup language
中文全稱:可拓展的標記語言
XML定義:XML是用於標記電子文件使其具有結構性的標記語言,可以標記數據,定義數據類型,XML是具有可拓展性的。
<html>
<head></head>
<body></body>
</html>
3、XML和HTML的差異
- html標簽不能自定義,從標簽上不能達到"見詞知意"的目的
<ul>
<li>華碩品質,堅若磐石</li>
</ul>
因為XML有可拓展性,所以可以自定義,所以可以在標簽命名的時候,給予有意義的名稱
<無序列表>
<列表項>華碩品質,堅若磐石</列表項>
</無序列表>
- html將數據與格式綁定在一起
HTML側重點是數據的表現形式。
<b>華碩品質,堅若磐石</b>
XML側重點是數據的本身。
<電腦>華碩品質,堅若磐石</電腦>
XML是存儲數據和描述數據結構,類比mysql。
- 不同瀏覽器解html不同
主流瀏覽器:火狐,谷歌,IE,其他瀏覽器。
XML不存在相容相容問題。98%以上的瀏覽器中打開XML文檔所展示的內容是一致的。
- html語法要求不嚴格
<ul>
<li>無序列表
</ul>
以上代碼在HTML中可以正常運行,不會提示任何語法錯誤。
但是XML語法要求是很嚴格的,會提示xx行沒有閉合標簽,xx語法錯誤。
-
XML的應用場景
- 充當程式間通訊的中間件(API)
SHOP(php) OA(JAVA)
可以使用XML來實現不同編程語言之間的數據交互。
XML在99%的編程語言中都支持。
- 配置文件
場景:100個項目都鏈接同一個資料庫
SHOP(PHP) OA(JAVA) ERP(C#) CRM(node.js) …100個
Config.php config.jsp config.apx config.js …
Config.xml
- 小型資料庫
XML在一些軟體或者APP中都充當本地緩存文件。
早期:金山詞霸的本地資料庫使用的XML。
4、規範數據格式
SHOP(PHP) OA(JAVA)
解析java項目生成的XML文件 Java按照規定的格式生成XML數據
需求:php想java項目獲取一個人的信息
期望需求: 名稱(varchar) 年齡(int) 性別(var)
實際返回: 年齡int 名稱varchar性別var
所以插入資料庫的時候會報錯。。
XML可以規範約束數據的格式
<person>
<Name> 1</name>
<age>2</age>
<sex>3</sex>
<person>
-
XML數據傳輸原理
-
XML快速入門
- 描述人的信息:
<?xml version='1.0' encoding='utf-8' ?>
<person>
<name>劉詩亮</name>
<age>26</age>
<sex>未知</sex>
<job>程式員</job>
</person>
描述書籍的信息:
<?xml version='1.0' encoding='utf-8' ?>
<book>
<title>《三體》</title>
<autuor>劉慈溪</autuor>
<price>99.8¥</price>
<publish>傳智出版社</publish>
<date>2016年1月13日</date>
</book>
二、XML語法
1、文檔聲明
在PHP中使用header()方法定義當前文檔的頭信息
在XML中使用文檔聲明來定義當前文檔的頭信息
基本語法:
<?xml version='1.0' encoding='utf-8' ?>
參數:version XML的版本號 1.0 (必填)
Encoding 當前文檔的字元集編碼 utf-8 (必填)
Standalone 當前文檔是否依賴月外部DTD no
2、元素(標簽,標記,節點)
元素是構成XML文檔的最基本的單位,為了識別和卻別元素,我們可以給元素給予有意義的命名:字母,數字,符號。但是,命名時必須得遵循相關的命名規範。
2.1、命名規範
- 元素的名稱必須以下劃線和字母開頭,後面可以跟字母,數字,符號(.-_)
- XML對大小寫銘感:<b></b> <B></B>
- XML元素名稱中不可以出現空格符或者製表符
示例代碼:
<?xml version="1.0" encoding="UTF-8" ?>
<person>
<_123>以下劃線開頭</_123>
<abcd>以字母開頭</abcd>
<_a.-_>綜合應用</_a.-_>
</person>
2.2、基本規範
- 一個XML文檔中有且只有一個根元素
- XML中的元素必須正確的嵌套
- XML中的元素必須閉合(除空元素外)
錯誤實例:必須正確的嵌套
<?xml version="1.0" encoding="UTF-8" ?>
<person>
<name>張某某</name><sex>未知</sex>
</person>
錯誤實例:元素標簽必須閉合
<?xml version="1.0" encoding="UTF-8" ?>
<person>
<name>張某某
</person>
2.3、根元素
在一個XML文檔中有且只有一個根元素,根元素就是XML文檔中最外層的那個元素。
2.4、空元素
在HTML有一些單標簽:<br/> <hr/>
空元素:沒有內容的元素
可以寫作:<元素名稱></元素名稱>
也可以寫作:<元素名稱/>
3、屬性
<a href=``></a>
3.1命名規範:同元素的命名規範一致。
- 屬性=的名稱必須以下劃線和字母開頭,後面可以跟字母,數字,符號(.-_)
- XML對大小寫銘感
- XML屬性名稱中不可以出現空格符或者製表符
示例代碼:
<?xml version="1.0" encoding="UTF-8" ?>
<person id="01" _id="02" _abc.="003" b="我是小b" B="我的大B">老張的XML</person>
3.2、基本規範
- 屬性必須在寫元素的開始標簽中
- 在同一個XML元素中,屬性名稱不能重覆
- XML屬性的值必須使用引號引起來(單引號和雙引號都可以)
示例代碼:
<?xml version="1.0" encoding="UTF-8" ?>
<perons say="偶哈呦" says='偶哈呦'>我是老張</perons >
3.3、關於屬性
問題思考:屬性是用來乾什麼?
XML屬性也可以用來存儲數據,但是儘量不要使用屬性來存儲數據
。
屬性是用來描述數據的數據。
<?xml version="1.0" encoding="UTF-8" ?>
<perons say="偶哈呦" says='偶哈呦'>
<member id="001">張三</member>
<member id="002">張三</member>
<member id="003">張三</member>
<member id="004">張三</member>
</perons
4、註釋
基本語法:
<!--我是註釋內容-->
註意:不可以在註釋內容中出現 --
5、特殊字元
在XML中存儲的數據會有一些XML敏感的符號,我們可以通過轉義字元實現替換。
在XML中提供了5中轉義字元
<
>
&
'
"
6、CDATA區段
在XML提供了大批量特殊字元存儲的方案。
示例代碼:
<?xml version="1.0" encoding="UTF-8" ?>
<code>
<![CDATA[
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DTD校驗器</title>
<script>
//1、實例化DTD對象
var M = new ActiveXObject('Microsoft.XMLDOM');
//2、開啟DTD校驗
M.validateOnParse = true;
//3、關閉非同步
M.async = false;
//4、載入XML文檔
M.load('entity.xml');
//5、配置調試信息
document.write('錯誤信息:'+ M.parseError.reason);
document.write('<hr/>');
document.write('錯誤行數:'+ M.parseError.line);
</script>
</head>
<body>
</body>
</html>
]]>
</code>
7、處理指令
作用:用來指揮軟體如何解析XML文檔。
語法:必須以"<?"作為開頭,以"?>"作為結尾。
常用處理指令:
xml指令
xml-stylesheet指令
例: <?xml-stylesheet type="text/css" href="style.css"?>
運行效果:
代碼太多:見
8、中文命名XML
只有支持中文的字元集才可以使用中文命名的XML文檔。
譬如常用的:utf-8
實例代碼:以下字元集不支持XML中使用中文
<?xml version="1.0" encoding="shift_jis" ?>
<英雄聯盟>
<英雄 id="坦克">德瑪西亞.蓋倫</英雄>
<英雄 id="ADC">千珏</英雄>
<英雄 id="ADC">大嘴</英雄>
</英雄聯盟>
三、DTD語法
1、基本概念
- DTD是:文檔類型約束
- DTD是用來約束XML文檔的。
- 凡是被DTD所約束的XML文檔,其元素,元素的組織方式,元素所包含的內容,元素的屬性都必須符合DTD所定義的規則。
- DTD所定義的規則:是由開發者自定義。
兩個凡是:
- 凡是滿足了XML語法規範的XML文檔,我們將其稱之為:結構良好的XML文檔
- 凡是滿足了DTD規則的XML文檔,我們將其稱之為:有效的XML文檔。
關係:有效和結構良好的XML文檔有什麼關係?
- 結構良好的XML文檔不一定是有效的XML文檔
- 有效的XML文檔一定是結構良好的XML
一張圖看懂兩者關係:
s
2、DTD結構
一個完整的DTD包含以下幾點:
- DTD聲明
- 元素聲明
- 屬性聲明
- 實體聲明
3、DTD聲明
通過DTD所編寫的位置的不同,將其分為內部DTD和外部DTD
3.1、內部DTD
基本語法:
<!DOCTYPE 根元素[
]>
<!DOCTYPE person[
<!--編寫相關的DTD語法-->
]>
3.2、外部DTD
<!DOCTYPE 根元素 SYSTEM `外部DTD文檔的路徑`>
-
DTD校驗器
作用:是引來校驗XML文檔是否符合DTD所定義的規則。
DTD校驗器只支持IE瀏覽器,因為ActiveXObject對象只有在IE瀏覽器中存在,所以我們在調試的時候,通過IE瀏覽器調試。
4.1、創建DTD校驗器五步走
<script>
//1、實例化DTD校驗器
var M = new ActiveXObject('Microsoft.XMLDOM');
//2、開啟DTD校驗器
M.validateOnParse = true;
//3、關閉非同步
M.async =false;
//4、載入XML文檔
M.load('demo02.xml');
//5、配置調試信息
document.write('錯誤信息:'+ M.parseError.reason);
document.write('<hr/>');
document.write('錯誤行數:'+ M.parseError.line);
</script>
-
元素聲明
5.1、格式聲明
基本格式:
<!ELEMENT 元素名稱 元素類型>
實例代碼:
<!DOCTYPE person[
<!ELEMENT person (#PCDATA)>
]>
52、內容聲明(屬性類型)
- (#PCDATA) 被聲明的元素的內容必須為字元串
- ANY 被聲明的元素的內容可以是子元素可以是字元串
- EMPTY 被聲明的元素的內容必須為空。
示例代碼:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person ANY>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age EMPTY>
]>
<person>
<name>偶哈呦</name>
<age></age>
</person>
5.3、子元素聲明
- (元素1,元素2,元素3,…..,元素n) 被聲明元素必須按照這樣的順序出場
- (元素1|元素2|元素3|…元素n) 被聲明的元素必須出現其中一個
示例代碼:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person (name,age,sex)>
<!ELEMENT name (name1|name2|name3)>
<!ELEMENT age ANY>
<!ELEMENT sex ANY>
<!ELEMENT name1 ANY>
<!ELEMENT name2 ANY>
<!ELEMENT name3 ANY>
]>
<person>
<name>
<name3></name3>
</name>
<age></age>
<sex></sex>
</person>
5.4、混合聲明
實例代碼:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person (name,age,(sex|job|address))>
<!ELEMENT name ANY>
<!ELEMENT age ANY>
<!ELEMENT sex ANY>
<!ELEMENT job ANY>
<!ELEMENT address ANY>
]>
<person>
<name></name>
<age></age>
<address></address>
</person>
3.5、修飾符
* 被聲明的元素可以出現0次或者多次(隨意)
? 被聲明的元素可以出現1次或者0次(最多一次)
+ 被聲明的元素可以出現1次或者多次(最少一次)
示例代碼:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person (name?,age*,sex+,job)>
<!ELEMENT name ANY>
<!ELEMENT age ANY>
<!ELEMENT sex ANY>
<!ELEMENT job ANY>
<!ELEMENT address ANY>
]>
<person>
<name></name>
<age></age>
<age></age>
<sex></sex>
<job></job>
</person>
-
屬性聲明
6.1、格式聲明
<!ATTLIST 元素名稱 屬性名稱 屬性類型 預設值>
6.2屬性類型(內容聲明)
- CDATA 被聲明的屬性的值可以是字元串
- ID 被聲明的屬性的值在整個文檔中必須唯一,且屬性的值必須符合XML命名規範。
- (值1|值2|值3|值4) 枚舉,被聲明的屬性的值必須為其中一個。
實例代碼:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person (name,sex)*>
<!ATTLIST person id CDATA #REQUIRED>
<!ELEMENT name ANY>
<!ATTLIST name id ID #REQUIRED>
<!ATTLIST name id ID #REQUIRED>
<!ELEMENT age ANY>
<!ELEMENT sex ANY>
<!ATTLIST sex var (男|女|未知) #REQUIRED>
]>
<person id="001" >
<name id="a02"></name>
<sex var="未知"></sex>
</person>
6.3、預設值
- #REQUIRED 被聲明的屬性必須包含
- #IMPLIED 可有可無
- #FIXED `固定值` 值必須為固定的
示例代碼:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person (name,age,sex)>
<!ELEMENT name ANY>
<!ATTLIST name daming CDATA #IMPLIED>
<!ATTLIST name xiaoming CDATA #REQUIRED>
<!ELEMENT age ANY>
<!ATTLIST age number CDATA #FIXED '18'>
<!ELEMENT sex ANY>
]>
<person>
<name daming="我是大明" xiaoming="我的小明"></name>
<age number="18"></age>
<sex></sex>
</person>
7、實體
7.1、引用實體
<;
>
&
'
"
基本語法:
<!ENTITY 實體名稱 `實體值`>
實例代碼:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person ANY>
<!ENTITY name "偶哈呦">
<!ENTITY school "傳智播客">
<!ENTITY teacher "張某某">
<!ENTITY class "PHP十五期">
]>
<person>
我是來自於 &school;的 &class;的 &teacher;
</person>
7.2、參數實體:
參數實體用於DTD內部。
參數實體只能在外部DTD中定義。
基本語法:
<!ENTITY % 實體名稱 `實體值`>
使用方法:
%實體名稱;
示例代碼:waibu.DTD
<!ELEMENT person (name)>
<!ENTITY % type "(#PCDATA)">
<!ELEMENT name %type;>
<!ENTITY name "偶哈呦">
<!ENTITY school "傳智播客">
<!ENTITY teacher "張某某">
<!ENTITY class "PHP十五期">
實例代碼:demo_17_canshushiti.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person SYSTEM "waibu.DTD">
<person>
<name>
啦啦啦啦
</name>
</person>
運行效果: