1. XML簡介
以下內容來自于http://www.w3school.com.cn/xml
基本知識
XML 和 HTML 為不同的目的而設計:XML 被設計為傳輸和存儲數據,其焦點是數據的內容。HTML 被設計用來顯示數據,其焦點是數據的外觀。HTML 旨在顯示信息,而 XML 旨在傳輸信息。
XML 沒有預定義的標簽。在 HTML 中使用的標簽(以及 HTML 的結構)是預定義的。HTML 文檔只使用在 HTML 標準中定義過的標簽。XML 允許創作者定義自己的標簽和自己的文檔結構。
在 XML 中,省略關閉標簽是非法的。所有元素都必須有關閉標簽。
XML 標簽對大小寫敏感。在 XML 中,標簽 與標簽 是不同的。
XML 文檔必須有一個元素是所有其他元素的父元素。該元素稱為根元素。
與 HTML 類似,XML 也可擁有屬性(名稱/值的對)。在 XML 中,XML 的屬性值須加引號,不過單引號和雙引號均可使用。XML 元素可以在開始標簽中包含屬性,類似 HTML。屬性 (Attribute) 提供關于元素的額外(附加)信息。
實體引用:在 XML 中,一些字符擁有特殊的意義。例如,你把字符 "<" 放在 XML 元素中,會發生錯誤,這是因為解析器會把它當作新元素的開始。在 XML 中,有 5 個預定義的實體引用:<對應<, >對應>, &對應=, '對應‘,"對應’。
在 XML 中,空格會被保留,文檔中的空格不會被刪節。 HTML 會把多個連續的空格字符裁減(合并)為一個。
XML 以 LF 存儲換行 (在 Windows 應用程序中,換行通常以一對字符來存儲:回車符 (CR) 和換行符 (LF)。這對字符與打字機設置新行的動作有相似之處。在 Unix 應用程序中,新行以 LF 字符存儲。而 Macintosh 應用程序使用 CR 來存儲新行。)
XML 元素必須遵循以下命名規則:名稱可以含字母、數字以及其他的字符;名稱不能以數字或者標點符號開始;名稱不能以字符 “xml”(或者 XML、Xml)開始;名稱不能包含空格。XML元素名稱可使用任何名稱,沒有保留的字詞。XML元素命名建議使名稱具有描述性,使用下劃線的名稱也很不錯,應避免使用-、.、:命名。
“形式良好”的 XML & “合法”的 XML
擁有正確語法的 XML 被稱為“形式良好”的 XML。通過 DTD 驗證的 XML 是“合法”的 XML。
“形式良好”(Well Formed)的 XML 文檔會遵守 XML 語法規則:XML 文檔必須有根元素、XML 文檔必須有關閉標簽、XML 標簽對大小寫敏感、XML 元素必須被正確的嵌套、XML 屬性必須加引號。
合法的 XML 文檔是“形式良好”的 XML 文檔,同樣遵守文檔類型定義 (DTD) 的語法規則,如下面的XML文檔中,DOCTYPE 聲明是對外部 DTD 文件的引用。
XML DTD
? ? DTD 的作用是定義 XML 文檔的結構。它使用一系列合法的元素來定義文檔結構:
XML Schema
W3C 支持一種基于 XML 的 DTD 代替者,它名為 XML Schema。與 DTD 不同,XML Schema 已經開始支持數據類型,同時 XML Schema 使用 XML 語法。
錯誤處理
W3C 的 XML 規范聲明:如果 XML 文檔存在錯誤,那么程序就不應當繼續處理這個文檔。理由是,XML 軟件應當輕巧,快速,具有良好的兼容性。
XSLT
通過使用 XSLT(eXtensible Stylesheet Language Transformations),您可以向 XML 文檔添加顯示信息。XSLT 是首選的 XML 樣式表語言。使用 XSLT 的方法之一是在瀏覽器顯示 XML 文件之前,先把它轉換為 HTML。
一個示例的XSLT為如下(記為simple.xsl)
使用該xsl的XML文件為
在上例中,XSLT 轉換是由瀏覽器完成的,瀏覽器讀取的是 XML 文件。在使用 XSLT 來轉換 XML 時,不同的瀏覽器可能會產生不同結果。為了減少這種問題,可以在服務器上進行 XSLT 轉換。不論轉換由服務器還是由瀏覽器進行,輸出結果完成相同。
XMLHttpRequest對象
XMLHttpRequest 對象用于在后臺與服務器交換數據。
XMLHttpRequest 對象是開發者的夢想,因為您能夠:在不重新加載頁面的情況下更新網頁、在頁面已加載后從服務器請求數據、在頁面已加載后從服務器接收數據、在后臺向服務器發送數據。
所有現代的瀏覽器都支持 XMLHttpRequest 對象。
通過一行簡單的 JavaScript 代碼,我們就可以創建 XMLHttpRequest 對象。xmlhttp=new XMLHttpRequest();
實例如下:
onreadystatechange 是一個事件句柄。它的值 (state_Change) 是一個函數的名稱,當 XMLHttpRequest 對象的狀態發生改變時,會觸發此函數。狀態從 0 (uninitialized) 到 4 (complete) 進行變化。僅在狀態為 4 時,我們才執行代碼。
XML 解析器
所有現代瀏覽器都內建了供讀取和操作 XML 的 XML 解析器。解析器把 XML 轉換為 XML DOM 對象 - 可通過 JavaScript 操作的對象。
a. 通過微軟的 XML 解析器來加載 XML
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); ? xmlDoc.async="false"; ? xmlDoc.load("note.xml");
上面代碼的第一個行創建一個空的微軟 XML 文檔對象。第二行關閉異步加載,這樣確保在文檔完全加載之前解析器不會繼續腳本的執行。第三行告知解析器加載名為 "note.xml" 的 XML 文檔。
b. 在 Firefox 及其他瀏覽器中的 XML 解析器
var xmlDoc=document.implementation.createDocument("","",null); ? xmlDoc.async="false"; ? xmlDoc.load("note.xml");
解析 XML 字符串
if (window.DOMParser)??
{?? ? ? ?parser=new DOMParser(); ?? ? ? ?xmlDoc=parser.parseFromString(txt,"text/xml"); ??}
else// Internet Explorer
{? xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); ? ?xmlDoc.async="false"; ? ?xmlDoc.loadXML(txt);? }
Internet Explorer 使用 loadXML() 方法來解析 XML 字符串,而其他瀏覽器使用DOMParser 對象。(loadXML()方法用于加載字符串(文本),load()用于加載文件)
XML DOM
XML DOM (XML Document Object Model) 定義了訪問和操作 XML 文檔的標準方法。
xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;
getElementsByTagName(“to") 方法會返回包含所有"to"?節點的數組。
XML 命名空間(XML Namespaces)
XML 命名空間提供避免元素命名沖突的方法。
比如同一個<table>標簽,用作兩個用途:1. 代表表格的含義, 2. 代表家具的含義。此時,可以通過使用前綴來進行區分。<h:table>代表表格,<f:table>代表家具。命名沖突不存在了,這是由于兩個文檔都使用了不同的名稱來命名它們的? 元素 ( 和 )。通過使用前綴,我們創建了兩種不同類型的 元素。
與僅僅使用前綴不同,我們為? 標簽添加了一個 xmlns 屬性(<f:table xmls:f="http://xxxxx">),這樣就為前綴賦予了一個與某個命名空間相關聯的限定名稱。
XML Namespace (xmlns) 屬性:XML 命名空間屬性被放置于元素的開始標簽之中,并使用以下的語法:xmlns:namespace-prefix="namespaceURI".當命名空間被定義在元素的開始標簽中時,所有帶有相同前綴的子元素都會與同一個命名空間相關聯。注釋:用于標示命名空間的地址不會被解析器用于查找信息。其惟一的作用是賦予命名空間一個惟一的名稱。不過,很多公司常常會作為指針來使用命名空間指向實際存在的網頁,這個網頁包含關于命名空間的信息。
默認的命名空間(Default Namespaces) 為元素定義默認的命名空間可以讓我們省去在所有的子元素中使用前綴的工作。語法:xmlns="namespaceURI",標識此xml文檔攜帶namespaceURI標明的信息。
XML CDATA
所有 XML 文檔中的文本均會被解析器解析。只有 CDATA 區段(CDATA section)中的文本會被解析器忽略。
PCDATA 指的是被解析的字符數據(Parsed Character Data)。
術語 CDATA 指的是不應由 XML 解析器進行解析的文本數據(Unparsed Character Data)。在 XML 元素中,"<" 和 "&" 是非法的。"<" 會產生錯誤,因為解析器會把該字符解釋為新元素的開始。"&" 也會產生錯誤,因為解析器會把該字符解釋為字符實體的開始。某些文本,比如 JavaScript 代碼,包含大量 "<" 或 "&" 字符。為了避免錯誤,可以將腳本代碼定義為 CDATA。CDATA 部分中的所有內容都會被解析器忽略。CDATA 部分由 "" 開始,由 "]]>" 結束:CDATA 部分不能包含字符串 "]]>"。也不允許嵌套的 CDATA 部分。標記 CDATA 部分結尾的 "]]>" 不能包含空格或折行。
2. ?DTD
DTD(文檔類型定義)的作用是定義 XML 文檔的合法構建模塊;它使用一系列的合法元素來定義文檔結構。
DTD 可被成行地聲明于 XML 文檔中,也可作為一個外部引用。
假如 DTD 被包含在您的 XML 源文件中,它應當通過下面的語法包裝在一個 DOCTYPE 聲明中:
帶有 DTD 的 XML 文檔實例
以上 DTD 解釋如下:
!DOCTYPE note(第二行)定義此文檔是note類型的文檔。
!ELEMENT note(第三行)定義note元素有四個元素:"to、from、heading,、body"
!ELEMENT to(第四行)定義to元素為 "#PCDATA" 類型
!ELEMENT from(第五行)定義from元素為 "#PCDATA" 類型
!ELEMENT heading(第六行)定義heading元素為 "#PCDATA" 類型
!ELEMENT body(第七行)定義body元素為 "#PCDATA" 類型
假如 DTD 位于 XML 源文件的外部,那么它應通過下面的語法被封裝在一個 DOCTYPE 定義中:
這個 XML 文檔和上面的 XML 文檔相同,但是擁有一個外部的 DTD:
這是包含 DTD 的 "note.dtd" 文件:
為什么使用 DTD?
通過 DTD,您的每一個 XML 文件均可攜帶一個有關其自身格式的描述。
通過 DTD,獨立的團體可一致地使用某個標準的 DTD 來交換數據。
而您的應用程序也可使用某個標準的 DTD 來驗證從外部接收到的數據。
您還可以使用 DTD 來驗證您自身的數據。
DTD - XML 構建模塊
所有的 XML 文檔(以及 HTML 文檔)均由以下簡單的構建模塊構成:元素、屬性、實體、PCDATA、CDATA。
元素是 XML 以及 HTML 文檔的主要構建模塊。HTML 元素的例子是 "body" 和 "table"。XML 元素的例子是 "note" 和 "message" 。元素可包含文本、其他元素或者是空的。空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。
屬性可提供有關元素的額外信息。屬性總是被置于某元素的開始標簽中。屬性總是以名稱/值的形式成對出現的。
實體是用來定義普通文本的變量。實體引用是對實體的引用(轉移字符的意思)。大多數同學都了解這個 HTML 實體引用:" "。這個“無折行空格”實體在 HTML 中被用于在某個文檔中插入一個額外的空格。當文檔被 XML 解析器解析時,實體就會被展開。
PCDATA 的意思是被解析的字符數據(parsed character data)。可把字符數據想象為 XML 元素的開始標簽與結束標簽之間的文本。PCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。文本中的標簽會被當作標記來處理,而實體會被展開。
CDATA 的意思是字符數據(character data)。CDATA 是不會被解析器解析的文本。在這些文本中的標簽不會被當作標記來對待,其中的實體也不會被展開。
DTD - 元素
在 DTD 中,XML 元素通過元素聲明來進行聲明。元素聲明使用下面的語法: <!ELEMENT 元素名稱 類別> 或者 <!ELEMENT 元素名稱(元素內容)>
空元素通過類別關鍵詞EMPTY進行聲明: <!ELEMENT 元素名稱 EMPTY>
只有 PCDATA 的元素通過圓括號中的 #PCDATA 進行聲明:<!ELEMENT 元素名稱 (#PCDATA)>
通過類別關鍵詞 ANY 聲明的元素,可包含任何可解析數據的組合:<!ELEMENT 元素名稱 ANY>
帶有一個或多個子元素的元素通過圓括號中的子元素名進行聲明:<!ELEMENT 元素名稱(子元素名稱1,子元素名稱2, ...)>當子元素按照由逗號分隔開的序列進行聲明時,這些子元素必須按照相同的順序出現在文檔中。在一個完整的聲明中,子元素也必須被聲明,同時子元素也可擁有子元素。
聲明只出現一次的元素: <!ELEMENT 元素名稱 (子元素名稱)>
聲明最少出現一次的元素:<!ELEMENT 元素名稱 (子元素名稱+)>
聲明出現零次或多次的元素:<!ELEMENT 元素名稱 (子元素名稱*)>
聲明出現零次或一次的元素:<!ELEMENT 元素名稱 (子元素名稱?)>
聲明“非.../既...”類型的內容: <!ELEMENT note (to,from,header,(message|body)>聲明了:"note" 元素必須包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。
DTD 屬性
在 DTD 中,屬性通過 ATTLIST 聲明來進行聲明。
屬性聲明使用下列語法:<!ATTLIST 元素名稱 屬性名稱 屬性類型 默認值>
屬性類型包括:CDATA、(en1|en2|..)、ID、IDREF、IDREFS、NMTOKEN、NMTOKENS、ENTITY、ENTITIES、NOTATION、xml:
默認值包括:#REQUIRED(屬性值是必需的)、#IMPLIED(屬性不是必需的)、#FIXED value(屬性值是固定的)
DTD 實體
實體是用于定義引用普通文本或特殊字符的快捷方式的變量。實體引用是對實體的引用。實體可在內部或外部進行聲明。
一個內部實體聲明: <!ENTITY 實體名稱 "實體的值">;對應的DTD例子<!ENTITY writer "BILL Gates"> <!ENTITY copyright "Copyright w3cschool.com.cn">;對應的XML例子<author>&writer;©right;</author>。一個實體由三部分構成:一個和號(&),一個實體名稱,以及一個分號(;)。
一個外部實體聲明:<!ENTITY 實體名稱 SYSTEM "URI/URL">;DTD例子:<!ENTITY writer SYSTEM "http://www.w3scholld.com.cn/dtd/entities.dtd">
3. XML Schema
XML Schema 是基于 XML 的 DTD 替代者。XML Schema 描述 XML 文檔的結構。XML Schema 語言也稱作 XML Schema 定義(XML Schema Definition,XSD)。XML Schema 的作用是定義 XML 文檔的合法構建模塊,類似 DTD。
XML Schema 是 DTD 的繼任者,功能更為強大:XML Schema 支持數據類型、XML Schema 支持命名空間。
名為 "note.xsd" 的 XML Schema 文件,示例如下,note 元素是一個復合類型,因為它包含其他的子元素。其他元素 (to, from, heading, body) 是簡易類型。
<schema>元素是每一個 XML Schema 的根元素:<xs:schema> ?... ? </xs:schema>
<schema>可包含屬性,如xmlns:xs="http://wwww.w3.org/2001/XMLSchema"說明schema中用到的元素和數據類型來自于命名空間http://www.w3.org/2001/XMLSchema,同時它還規定了來自于命名空間“http://www.w3.org/2001/XMLSchema”的元素和數據類型應該使用前綴xs:
targetNamespace="http://www.w3school.com.cn"顯示被此schema定義的元素(note,to, from, ...)來自命名空間http://www.w3school.com.cn
xmlns="http://www.w3school.com.cn"指出命名空間是"http://www.w3cschoold.com.cn
elementFormDefault="qualifies"指出任何 XML 實例文檔所使用的且在此 schema 中聲明過的元素必須被命名空間限定。
對 XML Schema 的引用,示例如下
xmlns="http://www.w3school.com.cn" 規定了默認命名空間的聲明。此聲明會告知 schema 驗證器,在此 XML 文檔中使用的所有元素都被聲明于 "http://www.w3school.com.cn" 這個命名空間。
一旦您擁有了可用的 XML Schema 實例命名空間:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
您就可以使用 schemaLocation 屬性了。此屬性有兩個值。第一個值是需要使用的命名空間。第二個值是供命名空間使用的 XML schema 的位置: xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
簡單的類型
XSD 簡易元素
簡易元素指那些只包含文本的元素。它不會包含任何其他的元素或屬性。不過,“僅包含文本”這個限定卻很容易造成誤解。文本有很多類型。它可以是 XML Schema 定義中包括的類型中的一種(布爾、字符串、數據等等),或者它也可以是您自行定義的定制類型。您也可向數據類型添加限定(即 facets),以此來限制它的內容,或者您可以要求數據匹配某種特定的模式。
定義簡易元素的語法:<xs:element name="xxx" type="yyy"/>,此處 xxx 指元素的名稱,yyy 指元素的數據類型。XML Schema 擁有很多內建的數據類型:xs:string、xs:decimal、xs:integer、xs:boolean、xs:date、xs:time。
簡易元素的默認值和固定值:簡易元素可擁有指定的默認值或固定值。<xs:element name="color" type="xs:string" default="red"/>, <xs:element name="color" type="xs:string" fixed="red">
XSD 屬性
所有的屬性均作為簡易類型來聲明。簡易元素無法擁有屬性。假如某個元素擁有屬性,它就會被當作某種復合類型。但是屬性本身總是作為簡易類型被聲明的。
定義屬性的語法是:? <xs:attribute name="xxx" type="yyy"/> 。在此處,xxx 指屬性名稱,yyy 則規定屬性的數據類型。XML Schema 擁有很多內建的數據類型:xs:string、xs:decimal、xs:integer、xs:boolean、xs:date、xs:time。
屬性可擁有指定的默認值或固定值: <xs:attribute name="lang" type="xs:string" default="EN"/>, <xs:attribute name="lang" type="xs:string" fixed="EN"/>
在缺省的情況下,屬性是可選的。如需規定屬性為必選,請使用 "use" 屬性:<xs:attribute name="lang" type="xs:string" use="required"/>
XSD 限定 / Facets
限定(restriction)用于為 XML 元素或者屬性定義可接受的值。對 XML 元素的限定被稱為 facet。
對值的限定: 下面的例子定義了帶有一個限定且名為 "age" 的元素。age 的值不能低于 0 或者高于 120
對一組值的限定:如需把 XML 元素的內容限制為一組可接受的值,我們要使用枚舉約束(enumeration constraint)。
注釋:在下列情況下,類型 "carType" 可被其他元素使用,因為它不是 "car" 元素的組成部分。
復雜類型
在 XML Schema 中,我們有兩種方式來定義復合元素:
1. 通過命名此元素,可直接對"employee"元素進行聲明,就像這樣:
2. "employee" 元素可以使用 type 屬性,這個屬性的作用是引用要使用的復合類型的名稱:
可以在已有的復合元素之上以某個復合元素為基礎,然后添加一些元素,就像這樣
為了使字符數據可以出現在 "letter" 的子元素之間,mixed 屬性必須被設置為 "true"。
XSD 復合類型指示器
通過指示器,我們可以控制在文檔中使用元素的方式。
有七種指示器:
Order 指示器:All、Choice、Sequence
Order 指示器用于定義元素的順序。 <all>指示器規定子元素可以按照任意順序出現,且每個子元素必須只出現一次。?<choice>指示器規定可出現某個子元素或者可出現另外一個子元素(非此即彼)。?<sequence>規定子元素必須按照特定的順序出現。
Occurrence 指示器:maxOccurs、minOccurs
Occurrence 指示器用于定義某個元素出現的頻率。對于所有的 "Order" 和 "Group" 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默認值均為 1。
Group 指示器:Group name、attributeGroup name
元素組通過 group 聲明進行定義,您必須在 group 聲明內部定義一個 all、choice 或者 sequence 元素。
屬性組通過 attributeGroup 聲明來進行定義.
<any>和<anyAttribute>均可用于制作可擴展的文檔,它們使文檔有能力包含未在主 XML schema 中聲明過的附加元素。
通過 XML Schema,一個元素可對另一個元素進行替換。我們可以在 XML schema 中定義一個substitutionGroup。首先,我們聲明主元素,然后我們會聲明次元素,這些次元素可聲明它們能夠替換主元素。可替換元素的類型必須和主元素相同,或者從主元素衍生而來。假如可替換元素的類型與主元素的類型相同,那么您就不必規定可替換元素的類型了。請注意,substitutionGroup 中的所有元素(主元素和可替換元素)必須被聲明為全局元素,否則就無法工作!全局元素指 "schema" 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。
為防止其他的元素替換某個指定的元素,請使用 block 屬性:<xs:element name="name" type="xs:string"block="substitution"/>
編寫XML Schema:
1. 首先對所有元素和屬性的定義,然后再使用 ref 屬性來引用它們。 ?
或 2.? 定義了類或者類型,這樣使我們有能力重復使用元素的定義。具體的方式是:首先對簡易元素和復合元素進行命名,然后通過元素的 type 屬性來指向它們。 restriction 元素顯示出數據類型源自于 W3C XML Schema 命名空間的數據類型。因此,下面的片段也就意味著元素或屬性的值必須是字符串類型的值:<xs:restriction base="xs:string"/>
數據類型
字符串數據類型(String Data Type)字符串數據類型可包含字符、換行、回車以及制表符,string
規格化字符串數據類型源自于字符串數據類型。規格化字符串數據類型同樣可包含字符,但是 XML 處理器會移除折行,回車以及制表符。normalizedString
Token 數據類型同樣源自于字符串數據類型。Token 數據類型同樣可包含字符,但是 XML 處理器會移除換行符、回車、制表符、開頭和結尾的空格以及(連續的)空格。token
日期數據類型用于定義日期。日期使用此格式進行定義:"YYYY-MM-DD". date。 如需規定一個時區,您也可以通過在日期后加一個 "Z" 的方式,使用世界調整時間(UTC time)來輸入一個日期;或者也可以通過在日期后添加一個正的或負時間的方法,來規定以世界調整時間為準的偏移量,如2002-09-24-06:00
時間數據類型用于定義時間。時間使用下面的格式來定義:"hh:mm:ss" time。 如需規定一個時區,您也可以通過在時間后加一個 "Z" 的方式,使用世界調整時間(UTC time)來輸入一個時間;或者也可以通過在時間后添加一個正的或負時間的方法,來規定以世界調整時間為準的偏移量。
日期時間數據類型用于定義日期和時間。日期時間使用下面的格式進行定義:"YYYY-MM-DDThh:mm:ss",其中T為時間起始位置的標識。 dateTime。 ?時區設置同上。
持續時間數據類型用于規定時間間隔。時間間隔使用下面的格式來規定:"PnYnMnDTnHnMnS",其中:P 表示周期(必需)。nY 表示年數,nM 表示月數,nD 表示天數,T 表示時間部分的起始 (如果您打算規定小時、分鐘和秒,則此選項為必需),nH 表示小時數,nM 表示分鐘數,nS 表示秒數。? duration。 例如<period>P5Y</period>
十進制數據類型用于規定一個數值。 decimal。 注釋:您可規定的十進制數字的最大位數是 18 位。
整數數據類型? integer ?用于規定無小數成分的數值。?
其他雜項數據類型包括邏輯、base64Binary、十六進制、浮點、雙精度、anyURI、anyURI 以及 NOTATION。
邏輯數據性用于規定 true 或 false 值。boolean 合法的布爾值是 true、false、1(表示 true) 以及 0(表示 false)。
二進制數據類型用于表達二進制形式的數據。我們可使用兩種二進制數據類型:base64Binary (Base64 編碼的二進制數據)、hexBinary (十六進制編碼的二進制數據)。
anyURI 數據類型用于規定 URI。注釋:假如某個 URI 含有空格,請用 %20 替換它們。
4. SOAP
http://www.w3.org/TR/2000/NOTE-SOAP-20000508/
http://www.w3school.com.cn/soap/index.asp
SOAP 是一種簡單的基于 XML 的協議,它使應用程序通過 HTTP 來交換信息。
SOAP 指簡易對象訪問協議,是一種通信協議,用于應用程序之間的通信,是一種用于發送消息的格式,被設計用來通過因特網進行通信,獨立于平臺,獨立于語言,基于XML,簡單可擴展,允許繞過防火墻。
對于應用程序開發來說,使程序之間進行因特網通信是很重要的。目前的應用程序通過使用遠程過程調用(RPC)在諸如 DCOM 與 CORBA 等對象之間進行通信,但是 HTTP 不是為此設計的。RPC 會產生兼容性以及安全問題;防火墻和代理服務器通常會阻止此類流量。通過 HTTP 在應用程序間通信是更好的方法,因為 HTTP 得到了所有的因特網瀏覽器及服務器的支持。SOAP 就是被創造出來完成這個任務的。SOAP 提供了一種標準的方法,使得運行在不同的操作系統并使用不同的技術和編程語言的應用程序可以互相進行通信。
SOAP 是微軟 .net 架構的關鍵元素,用于未來的因特網應用程序開發。
一條 SOAP 消息就是一個普通的 XML 文檔,包含下列元素:
1. 必需的 Envelope 元素,可把此 XML 文檔標識為一條 SOAP 消息
2. 可選的 Header 元素,包含頭部信息
3. 必需的 Body 元素,包含所有的調用和響應信息
4. 可選的 Fault 元素,提供有關在處理此消息所發生錯誤的信息
所有以上的元素均被聲明于針對 SOAP 封裝的默認命名空間中:
http://www.w3.org/2001/12/soap-envelope
以及針對 SOAP 編碼和數據類型的默認命名空間:
http://www.w3.org/2001/12/soap-encoding
一些重要的語法規則:SOAP 消息必須用 XML 來編碼;SOAP 消息必須使用 SOAP Envelope 命名空間;SOAP 消息必須使用 SOAP Encoding 命名空間;SOAP 消息不能包含 DTD 引用;SOAP 消息不能包含 XML 處理指令。
可選的 SOAP Header 元素可包含有關 SOAP 消息的應用程序專用信息(比如認證、支付等)。如果 Header 元素被提供,則它必須是 Envelope 元素的第一個子元素。
所有 Header 元素的直接子元素必須是合格的命名空間。
SOAP 在默認的命名空間中 ("http://www.w3.org/2001/12/soap-envelope") 定義了三個屬性。這三個屬性是:actor、 mustUnderstand 以及 encodingStyle。這些被定義在 SOAP 頭部的屬性可定義容器如何對 SOAP 消息進行處理。通過沿著消息路徑經過不同的端點,SOAP 消息可從某個發送者傳播到某個接收者。并非 SOAP 消息的所有部分均打算傳送到 SOAP 消息的最終端點,不過,另一個方面,也許打算傳送給消息路徑上的一個或多個端點。SOAP 的 actor 屬性可被用于將 Header 元素尋址到一個特定的端點。SOAP 的 mustUnderstand 屬性可用于標識標題項對于要對其進行處理的接收者來說是強制的還是可選的。假如您向 Header 元素的某個子元素添加了 "mustUnderstand="1",則它可指示處理此頭部的接收者必須認可此元素。假如此接收者無法認可此元素,則在處理此頭部時必須失效。
必需的 SOAP Body 元素可包含打算傳送到消息最終端點的實際 SOAP 消息。
可選的 SOAP Fault 元素用于指示錯誤消息。如果已提供了 Fault 元素,則它必須是 Body 元素的子元素。在一條 SOAP 消息中,Fault 元素只能出現一次。SOAP 的 Fault 元素擁有下列子元素:faultcode,供識別故障的代碼;faultstring 可供人閱讀的有關故障的說明;faultactor,有關是誰引發故障的信息;detail 存留涉及 Body 元素的應用程序專用錯誤信息。
SOAP HTTP Binding:SOAP 方法指的是遵守 SOAP 編碼規則的 HTTP 請求/響應。HTTP + XML = SOAP?SOAP 請求可能是 HTTP POST 或 HTTP GET 請求。HTTP POST 請求規定至少兩個 HTTP 頭:Content-Type 和 Content-Length。
SOAP 的請求和響應的 Content-Type 頭可定義消息的 MIME 類型,以及用于請求或響應的 XML 主體的字符編碼(可選)。如POST /item HTTP/1.1 ? Content-Type: application/soap+xml; charset=utf-8
SOAP 的請求和響應的 Content-Length 頭規定請求或響應主體的字節數。