一. XML的概念
? ??XML:eXtensible Markup Language,可擴展標記語言。
? ??可擴展的含義,就是可以自己定義標簽。
????XML指可擴展標記語言,是獨立于軟件和硬件的信息傳輸工具;它是一種標記語言,很類似 HTML;XML的設(shè)計宗旨是傳輸數(shù)據(jù),而非顯示數(shù)據(jù);XML標簽沒有被預(yù)定義,需要自行定義標簽;XML被設(shè)計為具有自我描述性;XML是 W3C 的推薦標準。
二.XML的作用
????XML專用于保存或者傳輸(交換)數(shù)據(jù)。
? ? 保存數(shù)據(jù)可以體現(xiàn)在兩個方面:① 配置文件,比如各種軟件的配置文件;② 小型的數(shù)據(jù)庫。
? ? 傳輸(交換)數(shù)據(jù)體現(xiàn)在兩個方面:① Ajax,“Asynchronous?Javascript?And?XML”(異步 JavaScript 和 XML),現(xiàn)在json用的比較多;②?Web service:web 服務(wù) (xml最擅長的地方)。
? ? XML的新的應(yīng)用
????svg(可縮放矢量圖形):可縮放矢量圖形是基于可擴展標記語言,用于描述二維矢量圖形的一種圖形格式。SVG 使用 XML 格式定義圖形。
三.XML的結(jié)構(gòu)

? ??每個xml穩(wěn)定,都有一個聲明。
????整個XMl,是樹形結(jié)構(gòu),有且僅有一個根節(jié)點。
? ? 在這個樹形結(jié)構(gòu),有三個節(jié)點,元素節(jié)點 + 屬性節(jié)點 + 文本節(jié)點。
四.XML的語法
? ? (一)語法總則
????1,必須以XML聲明開頭;

????????version:版本號,目前推薦是1.0;encoding:編碼,字符集,建議使用utf-8。
? ??????需要注意的是字符集,如果有亂碼,肯定字符集設(shè)置不對的。保證你聲明的字符集和文件本身保存的字符集的一致。
????2,必須擁有唯一的根元素;
????3,開始標簽必須與結(jié)束標簽相匹配;
????4,元素對大小寫敏感,嚴格區(qū)分大小寫;
????5,所有的元素都必須關(guān)閉,注意單標簽;
????6,所有的元素都必須正確地嵌套
????7,必須對特殊字符使用實體
????(二)命名規(guī)則
? ??由于我們的xml中,所有的標簽都需要自己定義:
? ? 1,名稱可以含字母、數(shù)字以及其他的字符
? ? 2,名稱不能以數(shù)字或者標點符號開始
? ? 3,名稱不能以字符“xml”(或者 XML、Xml)開始
? ? 4,名稱不能包含空格
? ? 5,可使用任何名稱,沒有保留的字詞。
????建議,使用php的命名方式,盡量使用數(shù)字、字母、下劃線的組合。Xml支持中文。(但一般不用)
? ? 注意:① 避免"-"字符。如:"first-name",一些軟件會認為你需要提取第一個單詞。
? ?????????????② 避免"."字符。如:"first.name",一些軟件會認為 "name" 是對象 "first" 的屬性。
? ? ? ? ? ? ? ?③ 避免":"字符。冒號會被轉(zhuǎn)換為命名空間來使用。
? ? (三)元素節(jié)點 + 屬性節(jié)點 + 文本節(jié)點
? ? ? ? 1,定義元素節(jié)點
? ? ? ? 類似html:????<元素名>內(nèi)容</元素名>
? ? ? ? 2,定義屬性
? ? ? ? 類似html:????<元素名 屬性名=‘屬性值’>內(nèi)容</元素名>
? ? ? ? 注意:①屬性值必須被引號包圍,不過單引號和雙引號均可使用;
? ? ? ? ② 一個元素可以有多個屬性;
? ? ? ? ③ 元素中的屬性是不允許重復(fù)的;
? ? ? ? ④ 標簽屬性所代表的信息也可以被改成用子元素的形式來描述,但是屬性一般描述與數(shù)據(jù)無關(guān)的信息,比如 id,與數(shù)據(jù)相關(guān)的信息一般用子元素來描述。
? ? (四)實體引用
? ? 相當于轉(zhuǎn)義:有5個預(yù)定義的實體

? ? ? ? ? ? ? ? ????批量轉(zhuǎn)義


? ? (五)注釋
? ? ? ? 與html相同:<!-- 注釋內(nèi)容-->
? ??????注意,文檔聲明一定要放在最開頭。之前不要有任何東西。
五.DTD驗證?
? ? (一)概念
? ? XML的主要作用是 保存 和 傳輸數(shù)據(jù),在傳輸?shù)倪^程中,傳輸方和接受方 需要遵循一個規(guī)則,XML是需要通過這個規(guī)則的驗證的。
? ? XML驗證是指使用XML驗證技術(shù)來檢測我們的XML文檔是否合理(合法)。
? ? XML通過驗證的方式有兩種:
? ? ① DTD:Document Type Definition,文檔類型定義,目前使用最多的一種
? ? ② Schema:XSD,Xml Schema Definition,文檔結(jié)構(gòu)定義,是DTD的替代者。
????DTD用來驗證我們的xml是否符合它的定義,要滿足以下要求:
? ? ① 格式良好的文檔:語法正確文檔;
? ? ② 合法的文檔:在語法正確的基礎(chǔ)之上,符合某個規(guī)范的xml文檔。
? ? (二)DTD表現(xiàn)形式
? ? ? ? DTD一般書寫于聲明下面。
? ? ? ? DTD有兩種引用方式:①在xml文檔中直接定義;②外部定義,然后引用。

? ? ? ? 驗證方式:在線驗證(http://validator.w3.org/);

? ?歸納DTD的作用:
? ? ? ① 通過DTD,可一致地使用某個標準的 DTD 來交換數(shù)據(jù);
? ? ? ② 可使用某個標準的DTD來驗證從外部接收到的數(shù)據(jù);
? ? ? ③ 可以使用DTD來驗證自身的數(shù)據(jù)。
? 注意事項:
? ??① DTD描述了XML文檔有哪些節(jié)點、節(jié)點之間的關(guān)系以及節(jié)點的值等。(學習重點)
????② DTD驗證的不是語法,而是驗證XML文檔中應(yīng)該有哪些節(jié)點,節(jié)點之間的關(guān)系是什么,元素的值、屬性的值應(yīng)該由什么內(nèi)容組成。
????③ XML沒有DTD,可以正常工作,但不能很好的工作。
????④ 合法的XML文檔是“形式良好”的 XML 文檔,且遵守文檔類型定義 (DTD) 的語法規(guī)則。
? ?(三)DTD定義
? ? DTD的構(gòu)成:元素聲明 + 屬性聲明 + 實體聲明;
? ? ① 元素定義
? ??????元素聲明由三部分構(gòu)成:ELEMENT聲明 +? 元素名 +?元素內(nèi)容模型 ---定義了可允許的元素內(nèi)容
? ? ? ? 形式:<!ELEMENT 元素名 (元素內(nèi)容描述)>
? ? ? ? 注意:中間有空格。
? ? ? ? 元素的表現(xiàn)形式有一下幾種:
? ? ? ? {1} 僅包含元素的元素
? ? ? ? ? ? 通常有兩種結(jié)構(gòu):① 順序結(jié)構(gòu),直接用逗號分隔開;② 選擇結(jié)構(gòu),用 | 分隔,表示二者只能選擇其一。

? ? ? ? 表示:每個元素都要出現(xiàn),并且只能出現(xiàn)一次,還要按照順序依次出現(xiàn)。

? ? ? ? 表示:二者只能出現(xiàn)其中的一個,且必須出現(xiàn)一個。
? ? ? ? 如果元素多次出現(xiàn),使用數(shù)量詞:* 任意個,包括0;+?至少一個,至多不限;???0或1個
? ? ? ? {2}僅包含文本的元素

? ? ? ? ?{3}包含文本和元素的元素

? ??????[注意]:在DTD文件內(nèi)部定義混合內(nèi)容模型,必須要使用選擇組合,#PCDATA關(guān)鍵字必須出現(xiàn)在子元素列表的第一個位置,且必須要使用*。
? ? ? ? {4}空元素
? ??????????直接使用empty

? ? ? ? {5}任意元素(不推薦)
? ? ? ? ????<!ELEMENT 元素名 ANY>
? ? ? ? ② 屬性定義
? ??????????定義的屬性格式:<!ATTLIST 元素名 屬性名稱 屬性的類型 取值方式>
? ? ? ? ? ? 常用屬性類型:CDATA,值為字符數(shù)據(jù)(character data);(en1 | en2 |....),此值是枚舉列表中的一個值;ID,值為唯一的id............
? ? ? ? ? ? 常用取值方式:#REQUIRED,屬性值是必須的;#IMPLIED,屬性值不是必須的;#FIXED value,屬性值時固定的。





? ? ? ? ? ? 固定的值不能更改。
? ? ? ? ? ? 一次性定義多個屬性的簡寫

? ??????關(guān)于取值類型,必須要設(shè)置
????????如果沒有固定值、又沒有默認值,而且也不是必須的,那么此時一定要聲明為#IMPLIED。
? ? ? ? ③ 實體定義????
? ??????????文本節(jié)點,本身是無需定義的。
????????????書寫字符串的時候,有時候會重復(fù)使用某個的內(nèi)容,此時為了方便,可以將其定義為實體。類似在編程中的變量的含義。
????????????DTD中,通常有兩種實體:
? ? ? ? ? ? {1} 一般實體,在DTD中來定義的,然后在xml文檔中來引用的
? ? ? ? ? ? ? ? 定義格式:<!ENTITY 實體名稱 值>
????????????????引用:&實體名稱;


? ? ? ? ? ? {2} 參數(shù)實體,只能是在外部DTD中來定義的,并且參數(shù)實體只能在DTD中引用的。
? ? ? ? ? ? 在XML中引入DTD的語法格式:<!DOCTYPE 根元素名稱 SYSTEM 'dtd路徑'>
? ? ? ? ? ? 定義格式:<!ENTITY % 實體名稱 值>
? ? ? ? ? ? 引用格式:%實體名稱


? ? ? ? ? ? 在瀏覽器中無法查看效果,應(yīng)為瀏覽器不會加載外部DTD。
? ? 六.DOM方式操作XML
? ? ? ? ? ? PHP操作XML常用方法
? ? ? ? ? ? ①?DOM方式:所有語言都支持的方式,API相同? ? ? ? ? ??
? ? ? ? ? ? ②?SimpleXML方式:php提供一種簡單的方式
????????????{1} DOM的概念
? ??????????DOM:Document Object Model,文檔對象模型。
? ? ? ? ? ??D:document,是指的文檔本身,xml文檔,HTML文檔;
????????????O:Object,對象,是將元素、屬性和文本等轉(zhuǎn)成節(jié)點對象,對象有屬性和方法,可以調(diào)用這些屬性和方法完成相關(guān)的操作;
? ? ? ? ? ? M:Model,樹模型,將Document轉(zhuǎn)成一個樹模型,節(jié)點,節(jié)點之間有關(guān)聯(lián)。將這些節(jié)點轉(zhuǎn)成對象。轉(zhuǎn)換過程是在內(nèi)存中進行的。
? ? ? ? ? ? {2} DOM操作XML步驟


? ? ? ? ? ? {3}DOM操作XML的CRUD
? ? ? ? ? ? 1,查詢
? ? ? ? ? ? 如上圖,方法? getElementsByTagName
? ??????????2,增加
? ? ? ? ? ? 方法 createElement($name[,$value])
? ? ? ? ? ? 方法 appendChild 增加子節(jié)點,與JS相同的
? ? ? ? ? ? 有2個參數(shù),僅創(chuàng)建元素,則僅需要第一個參數(shù),為元素名稱;創(chuàng)建包含文本的元素,就需要第二個參數(shù),元素內(nèi)的文本.


????????????3,更新
? ? ? ? ? ? 直接操作文本節(jié)點


? ? ? ? ? ? 4,刪除
? ? ? ? ? ? 方法 removeChild(要刪除的節(jié)點),需要父元素調(diào)用該方法。
? ? ? ? ? ? 屬性 parentNode 獲得該元素的父節(jié)點

? ??????在刪除節(jié)點的同時,不要對他進行foreach操作,比如上面的錯誤做法
? ? ? ? 只需要將二者分開即可。先遍歷,找到所有的節(jié)點,用到保存起來,然后再對他進行刪除。
? ? ? ? 注意使用PHP手冊。
七.XPATH(查看手冊)
? ??????使用xpath,可以快速的定位到某個節(jié)點。使用xpath,可以快速的定位到某個節(jié)點。
? ? ? ? XPATH的主要作用就是增加查詢的速度,就好像數(shù)據(jù)庫中表的索引一樣。
????① 選取節(jié)點
? ? ? ? 方式1.? ?/? ?從根節(jié)點選取? ? ? ?例如,/根節(jié)點
? ? ? ? 方式2.??//? ?從匹配的當前節(jié)點選擇文檔中的節(jié)點,不論層次關(guān)系? ? 例如,//文檔中的節(jié)點
? ? ? ? 方式3.??.? ? 選取當前節(jié)點
? ??????方式4.?. .? ?選取當前節(jié)點的父節(jié)點? ?
? ? ? ? 方式5.? @? 選取屬性
? ? ② 謂語
? ??????謂語用來查找某個特定的節(jié)點或者包含某個指定的值的節(jié)點,謂語被嵌在方括號中。
? ? ? ? 比如:? ??/根節(jié)點/子節(jié)點[ 謂語 ]
? ? ? ? 謂語有:last(),position(),@屬性名,@屬性名=XX, 元素名>元素內(nèi)文本節(jié)點的值,等等。
? ??????在使用數(shù)量詞,或者last、position函數(shù)的時候,一定要注意,是針對同一個節(jié)點下面的元素。它們應(yīng)該有共同的父節(jié)點。
? ? ③ 其他用法
? ? ? ? 或 |? ? ?比如 //person/age? | //person/name? ?選取person元素的age和name 元素
? ? ? ? 通配符 *? 比如? ? //person/*? 匹配person下的任何節(jié)點

八.SimpleXML (查看手冊)
? ??????它是PHP專門提供的一種操作xml的簡單方式,只能在php中使用。
????????基本上,就只有一個對象:SimpleXMLElement
? ??????????得到SimpleXMLElement的兩種方式:
? ? ? ? ? ?①?直接使用構(gòu)造方法,傳遞的xml的內(nèi)容,不是文件名

? ? ? ? ? ?② 使用普通函數(shù),傳遞的文件名,simplexml_load_file


? ? ? ? 對象均是?SimpleXML 對象,可以直接操作。
? ? ? ? 使用方法:1.載入xml文檔;
? ? ? ? ? ? ? ? ? ? ? ? ? 2.進行具體的處理;
? ? ? ? ? ? ? ? ? ? ? ? ? 3.保存結(jié)果。
? ? ? ? SimpleXML?操作XML的CRUD
? ? ? ? ? ? ? ? ① 增加? ?使用方法 addChild

? ? ? ? ? ? ? ? ② 查詢
? ? ? ? ? ? ? ? ? ? 根據(jù)顯示結(jié)果,遍歷即可

? ? ? ? ? ? ? ? ③修改

? ? ? ? ? ? ? ? ④ 刪除
? ? ? ? ? ? ? ? ? ? unset 函數(shù)

九.XML應(yīng)用之Web Service
????web Service 的概念? ??
Web service是一個平臺獨立的,低耦合的,自包含的、基于可編程的web的應(yīng)用程序,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、發(fā)布、發(fā)現(xiàn)、協(xié)調(diào)和配置這些應(yīng)用程序,用于開發(fā)分布式的互操作的應(yīng)用程序。
? ??????????本質(zhì)就是通過網(wǎng)絡(luò)調(diào)用其他網(wǎng)站的資源。
????????????web service三要素:?SOAP?,WSDL,UDDI
? ? ? ? ① SOAP
????????????SOAP:Simple Object Access Protocol,簡單對象訪問協(xié)議。
? ??????????SOAP = XML + HTTP;
? ? ? ? ? ? PHP提供了操作SOAP的擴展,需要開啟。
? ? ? ? ? ? 在php.ini中,extension = php_soap.dll;
? ? ? ? ② WSDL
? ? ? ? ? ? WSDL:Web Service Description Language , web服務(wù)描述語言,就是XML文檔。
? ? ? ? XML應(yīng)用示例:使用 web service 查詢航班
? ? ? ? ? ????主要難點在與XML文檔結(jié)構(gòu)的分析? ? ? ? ? ? ? ??
? ? ? ? ? ? API接口
? ??????????http://www.webxml.com.cn/zh_cn/web_services.aspx

? ? ? ? ? ? ? ? 點擊第一個 Endpoint,進入下面頁面

? ? ? ? ? ? ? ? ? ? soapclient類
? ? ? ? ? ? ? ? ? ? 構(gòu)造方法 ,需要傳遞一個wsdl 文件
????????????????????public __construct( mixed?$wsdl?[,?array?$options?] )


? ? ? ? ? ? ? ? 有了 soapClient 對象,就可以調(diào)用 Endpoint 中 提供的 2個方法。
? ? ? ? ? ? ? ? 使用simpleXML 進行操作



