您好,登錄后才能下訂單哦!
這篇文章主要介紹了soap中的xml知識有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
一、 xml概述
在為soap尋找表述方法時,這個標準的制定者們其實有很多種選擇。但他們最終選擇了盡可能利用現有的技術,把必要的新術語數量壓縮到最少。為了描述soap信息的內容,這些作者們選擇了xml語言。它的全稱是“extensible Markup Language”,可擴展標記語言。
xml語言包含的功能非常多,比soap用到或者需要用到的要多的多。比如說,在soap 標準v1.1的第三節“與xml語言的關系”部分有說“在soap消息中不得包含文檔類型說明(Document Type Declaration, DTD)”。在soap消息中不得包含處理指令(Processing Instructions)。就soap采納的xml語言標準的有關內容來看,它定義的是soap功能的使用方法。我們很快就能體會到這一決定的英明之處:因為開發人員在使用soap的時候不需要擁有全功能的xml語法分析器,所以用soap來實現某個解決方案的工作很容易進行。為了理解soap,我們先要弄懂以下幾個概念:
1.統一資源標識符(Uniform Resource Identifiers, 簡稱URI)。
2.xml語言基礎。
3.xml格式定義。
4.xml名字空間。
5.xml屬性。
1.1 統一資源標識符
為了訪問因特網上某個獨一無二的資源項目,必須知道如何從眾多的對象中把它標識出來。統一資源描述符(URI)就是給各個資源起的名字。URI的格式:
<schema>:<schema-specific-part>
schema-specific-part部分往往還包含一些斜線字符(/),這些斜線字符表示的是路徑中的層次結構。
1.1.1 統一資源定位器(URL)
大家最為熟悉的URI要算是統一資源定位器(Uniform Resource Locator, URL)了,他就是我么通常所說的URL地址。URL地址也要遵守URI標識符的地址表示方法。
URL地址中的schema-specific-part部分格式是這樣的:
//<user>:<password>@<host>:<port>/<url-path>
上述語法中各組成元素的含義如下所示:
1.user:目標地址處的用戶名(可選項)。
2.password:分配給用戶user的密碼(可選項)。
3.host:某個網絡主機的因特網協議地址或完整域名(必選項)。
4.port:用來建立連接時使用的端口號。大部分協議都有默認的端口號,比如http在缺省時將使用80端口進行通信(可選項)。
5.url-path:訪問某個特定資源的詳細路徑。緊跟在主機名或端口號后面的斜線字符(/)不是url-path的組成部分。
1.1.2 統一資源名字(URN)
與無處不在的url地址相比,大多數web用戶對統一資源名字(Uniform Resource Name, URN)的熟悉程度要差很多。URN與URL的不同之處在于前者不會被解析成一個獨一無二的物理地點。URN是一種永久性的資源標識符(不像URL地址那樣會有一些動態的路徑信息),他們允許來自某個名字空間的其他類型標識符被映射到URN空間里來。因此,URN的語法提供了利用現有的各種協議對字符數據進行分析和編碼的能力。URN的構成規則也遵守URI的通用性規定,它的常見格式如下:
<URN>::=”urn:”<NID>”:”<NSS>
在URN名字里要用字符串”urn:”來表示這是一個URN名字。NID是”Namespace ID”的縮寫,NSS是”Namespace-Specific String”的縮寫,給出的是與NID代表的名字空間有關的字符串。在遇到URN名字的時候,我們要根據NID的值來決定如何解釋NSS字符串。在讀取或使用URN名字的時候,要記住前導字符串”urn:”以及<NID>內容里的字母是分大小寫的。
URL和URN是URI兩種最常見的用法。后面我們還會看到URI的另外一種用法:xml Namespace(xml命名空間)。
1.2 xml基礎
xml語言是在1996-1997年間進入人們視線的。下面是xml代碼示例:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <artifactId>framework</artifactId> <groupId>com.**.framework</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <packaging>war</packaging> </project>
即使你從沒度過xml程序代碼,這個例子也不是很難懂。我們可以通過這段代碼看出xml文檔的一些編寫規則。
(1)第一行是一條處理指令,作用是聲明這份文檔使用的xml版本和編碼格式,文檔中的這條語句并非不可或缺,但最好還是把它加載里面。
(2)xml文檔必須有一個封閉元素(版本信息不能算作是一個封閉元素)。在例子中project把整個文檔包括在了它的起始標記和結束標記之間。它還有幾個子元素,子元素又可以嵌套定義。
(3)這段代碼中的所有單詞都不是xml的關鍵字。
(4)注意文檔里標記不要拼錯了。即使拼錯了,xml語法分析器也會接受這份文檔,但它不會正確解析你的意圖了。如果我們想讓xml語法分析器為我們做一些檢查工作,并且只讀取正確的數據結構,那可以加上一個文檔類型說明(Document Type Declaration, DTD)或者一個xml大綱(xml schema)。這里不就DTD進行討論了,soap技術規范的第三小節也已經明確規定“在soap信息中不得包含文檔類型聲明”。
1.3 xml大綱
xml大綱(xml schema)比DTD的描述能力更強。這兩種事物都提供了對一個xml元素的結構進行定義的方法。雖然格式定義和DTD都允許對元素進行定義,但只有格式定義允許給出數據的類型信息。xml數據是基于文本的,它會用字符”4”而不是”0100”這樣的二進制形式來表示數字4(xml允許在信息中對二進制數據進行編碼,這樣使我們能夠把圖像數據等內容夾在一條xml信息里發送出去)。
下面給出實例,感受下大綱優于DTD的事實。
一個簡單的DTD有一些包含其他元素或字符數據的元素。最簡單的元素聲明是這樣的:給出元素的名字,再把元素的內容定義為字符數據。如下所示:
<! ELEMENT element-name (#PCDATA)>
一個元素可以由其他元素組合而成。如果一個元素不多不少只包含有某個給定元素的一個實例,我們就這樣定義:
<! ELEMENT parentElement (childElement)> <! ELEMENT childElement (#PCDATA)>
如果parentElement元素中可能包含零個或多個childElement元素,我們就用一個星號(*)來定義,如下:
<! ELEMENT parentElement (childElement *)> <! ELEMENT childElement (#PCDATA)>
另外,還可以在一個DTD里指示出元素的組合情況,比如parentElement元素里包含有兩種不同數據片段的情況,如下所示:
<! ELEMENT parentElement (childElement1, childElement2)> <! ELEMENT childElement1 (#PCDATA)> <! ELEMENT childElement2 (#PCDATA)>
具體示例,比如圖書館里有很多書,書又有書名,作者,版權等屬性,那定義的DTD文件Library.dtd可以是:
<! ELEMENT Library (Book*)> <! ELEMENT Book (Title, Author*, Copyright)> <! ELEMENT Title (#PCDATA)> <! ELEMENT Author (#PCDATA)> <! ELEMENT Copyright (#PCDATA)>
Library是由零個或多個Book類型的元素組成的。每個Book又是由一個Title元素,零個或多個Author類型的元素和一個Copyright元素組成。Title,Author和Copyright這三種元素都包含著字符數據。我們使用這個DTD來檢查xml內容,可以定義xml文檔:
<?xml version=”1.0”?> <!DOCTYPE Library PUBLIC “.” “Library.dtd”> <Library> <Book> <Title>Green Eggs</Title> <Author>Dr.Seuss</Author> <Copyright>1957</Copyright> </Book> <Book> <Title>Windows</Title> <Author>Scott</Author> <Copyright>2000</Copyright> </Book> </Library>
語法分析器在需要對數據的類型進行檢查時會自動加載Library.dtd,并根據它對文檔的內容進行檢查。這樣做的好處是顯而易見的,但如果我們還能在“這個元素包含著字符數據”以外給出更多的信息豈不是更好?因為各種理由,W3C最終發布了關于xml大綱的建議稿。下面用xml大綱重寫剛才的DTD文檔:
<Schema xmlns:xsd =”http://www.w3.org/2001/XMLSchema” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”> <complexType name=”Book” content=”mixed”> <element type=”Title”></element> <element type=”Author”></element> <element type=”Copyright”></element> </complexType> <simpleType name=”Title” content=”textOnly” xsi:type=”string”></simpleType> <simpleType name=”Author” content=”textOnly” xsi:type=”string”></simpleType> <simpleType name=”Copyright” content=”textOnly” xsi:type=”integer”></simpleType> </Schema>
把上面這段代碼存為一個xml文件(一般是xsd后綴)。在使用大綱的時候,只需簡單地在文檔里引用就行了,像下面:
<myLibrary:Library xmlns:myLibrary=”x-schema:http://www.scottseely.com/LibrarySchema.xml”> <myLibrary:Book> <myLibrary:Title>Green Eggs</ myLibrary:Title > <myLibrary:Author>Dr.seuss</ myLibrary:Author > < myLibrary:Copyright>1957</ myLibrary:Copyright> </myLibrary:Book> … </myLibrary:Library>
大綱和文檔都使用了文本“text”。這個字符串的作用是通知語法分析器此文檔里使用的變量名屬于給定URI指定的名字空間。如果URI以x-schema打頭,語法分析器就必須從指定地址加載相應的大綱文件。如果沒有其他說明,帶有xmlns聲明的起始標記及對應的結束標記之間的所有元素都是指定的名字空間的一部分。
1.3.1 數據特征
為了更好地對數據進行定義和類型校驗,xml大綱使用了“數據特征(facets)”來定義某個特定的數據類型的特性。一個數據值域空間的每個特性都必須用一個數據特征來定義。而一個“數據值域空間”就是一個給定的數據類型的全體有效數據值的集合。不同的數據類型是通過他們各自的數據特征來區分的。xml大綱文檔定義的數據特征又分為兩大類:基本特征和非基本特征。
一個基本特征就是某個數據值域空間里的數據值的一個抽象特性,他給出了這類數據值的一個基本特點。數據值的基本特征包括:
1.相等
2.順序
3.邊界
4.勢。這是一個集合論的概念。有些值域空間里的值在數量上是有限的,而一些則是無限的。
5.數值
6.長度,最小長度,最大長度
7.式樣
8.枚舉
9.最大內邊界,最大外邊界,最小內邊界,最大內邊界
10.經度
11.數值范圍
12.編碼方式
13.持續時間
14.周期
1.3.2 數據類型
xml格式定義把數據類型和數據特征結合起來,這就使在格式定義中定義的數據項有了準確的含義。www.w3.org/2001/XMLSchema中定義了許多數據類型。
1.4 xml命名空間
在上面已經見過xml命名空間(xml namespaces)的用法了。命名空間的作用簡單說來就是對用在一段上下文里的一組變量名進行定義和聲明。名字空間可以使用任意URN,但前提條件是這個URN必須是獨一無二的。
1.5 xml屬性
出現在這本書里的所有xml文檔都使用了元素來表示數據。但大家應該知道xml也支持屬性概念。元素必須有起始標記和結束標記,屬性則不同,他們不需要標記,只要把他們放到元素的起始標記里就行了。
對屬性進行聲明有三種不同的辦法:
1.精心編寫的xml,但不包含任何DTD或大綱
2.精心編寫的xml,使用一個DTD
3.精心編寫的xml,使用一個或者多個大綱。
第一種辦法能正常運行,但實用環境中效果并不好,而soap又禁止使用DTD,所以我們就說下第三種方法吧。在xml大綱創建屬性的時候,需要使用attributeType和attribute這兩個關鍵字。這兩個關鍵字只在大綱所屬的名字空間里有意義。attributeType用來定義某個類型的特性,而attribute則指出該元素類型定義所針對的對象。
為了使用屬性對book進行描述,相應的大綱應該是下面這個樣子:
<Schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”> <attributeType name=”title” xsi:type=”string” /> <attributeType name=”name” xsi:type=”string” /> <complexType name=”Author” content=”empty”> <attribute type=”name” /> <element type=”Author”> </complexType> </Schema>
attributeType的完整語法如下:
<attributeType default=”default value” xsi:type=”type” xsi:values=”enumerated values” name=”idref” required=”{yes|no}” >
default:屬性的默認值。
xsi:type:該屬性的數據類型。如果選擇的是枚舉類型,還要天上xsi:value。
name:屬性類型的名字。為了對attributeType進行類型檢查,必須有一個名字。
required:表明一個包含有attributeType的元素是否必須帶有此處定義的屬性。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“soap中的xml知識有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。