XML
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 头规定请求或响应主体的字节数。