xml基础

XML 被设计用来传输和存储数据。

HTML 被设计用来显示数据。

XML 文档形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”。

XML 文档必须包含根元素。该元素是所有其他元素的父元素。

XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。

所有元素均可拥有子元素

所有 XML 元素都须有关闭标签

XML 标签对大小写敏感

XML 必须正确地嵌套

XML 文档必须有根元素

XML 的属性值须加引号

在 XML 中,有 5 个预定义的实体引用:

&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos; ' 单引号
&quot; " 引号

XML 中的注释

在 XML 中编写注释的语法与 HTML 的语法很相似:

<!-- This is a comment --> 

在 XML 中,空格会被保留

HTML 会把多个连续的空格字符裁减(合并)为一个

在 XML 中,文档中的空格不会被删节。

XML 命名规则

XML 元素必须遵循以下命名规则:

  • 名称可以含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字符 “xml”(或者 XML、Xml)开始
  • 名称不能包含空格

可使用任何名称,没有保留的字词。

形式良好的 XML 文档

一个"形式良好"的 XML 文档拥有正确的语法。

一个"形式良好"的 XML 文档会遵守前几章介绍过的 XML 语法规则:

  • XML 文档必须有根元素
  • XML 文档必须有关闭标签
  • XML 标签对大小写敏感
  • XML 元素必须被正确的嵌套
  • XML 属性必须加引号

通过微软的 XML 解析器来加载 XML

微软的 XML 解析器内建于 Internet Explorer 5 以及更高的版本中。

下面的 JavaScript 片段把一个 XML 文档载入解析器中:

var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.load("note.xml");

例子解释:

  1. 上面代码的第一个行创建一个空的微软 XML 文档对象。
  2. 第二行关闭异步加载,这样确保在文档完全加载之前解析器不会继续脚本的执行。
  3. 第三行告知解析器加载名为 "note.xml" 的 XML 文档。

下面的 JavaScript 片段把字符串 txt 载入解析器:

var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(txt);

注释:loadXML() 方法用于加载字符串(文本),load() 用于加载文件。

在 Firefox 及其他浏览器中的 XML 解析器

下面的 JavaScript 片段把 XML 文档 ("note.xml") 载入解析器:

var xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.async="false";
xmlDoc.load("note.xml");

例子解释:

  1. 上面代码的第一个行创建一个空的 XML 文档对象。
  2. 第二行关闭异步加载,这样确保在文档完全加载之前解析器不会继续脚本的执行。
  3. 第三行告知解析器加载名为 "note.xml" 的 XML 文档。

下面的 JavaScript 片段把字符串 txt 载入解析器:

var parser=new DOMParser();
var doc=parser.parseFromString(txt,"text/xml");

例子解释:

  1. 上面代码的第一个行创建一个空的微软 XML 文档对象。
  2. 第二行告知解析器载入名为 txt 的字符串。

注释:Internet Explorer 使用 loadXML() 方法来解析 XML 字符串,而其他浏览器使用 DOMParser 对象

XPath

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。

因此,对 XPath 的理解是很多高级 XML 应用的基础。

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。

XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

XPath 术语

节点(Node)

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

请看下面这个 XML 文档:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author> 
  <year>2005</year>
  <price>29.99</price>
</book>

</bookstore>

上面的XML文档中的节点例子:

<bookstore> (文档节点)
<author>J K. Rowling</author> (元素节点)
lang="en" (属性节点) 

基本值(或称原子值,Atomic value)

基本值是无父或无子的节点。

基本值的例子:

J K. Rowling
"en"

项目(Item)

项目是基本值或者节点。

节点关系

父(Parent)

每个元素以及属性都有一个父。

在下面的例子中,book 元素是 title、author、year 以及 price 元素的父:

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

子(Children)

元素节点可有零个、一个或多个子。

在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子:

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

同胞(Sibling)

拥有相同的父的节点

在下面的例子中,title、author、year 以及 price 元素都是同胞:

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

先辈(Ancestor)

某节点的父、父的父,等等。

在下面的例子中,title 元素的先辈是 book 元素和 bookstore 元素:

<bookstore>

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

</bookstore>

后代(Descendant)

某个节点的子,子的子,等等。

在下面的例子中,bookstore 的后代是 book、title、author、year 以及 price 元素:

<bookstore>

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

</bookstore>

XML 实例文档

我们将在下面的例子中使用这个 XML 文档。

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

选取节点

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:

表达式描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

实例

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore

选取根元素 bookstore。

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

实例

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。

选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

 

XSLT

xSLT 是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。

正确的样式表声明

把文档声明为 XSL 样式表的根元素是 <xsl:stylesheet> 或 <xsl:transform>。

注释: <xsl:stylesheet> 和 <xsl:transform> 是完全同义的,均可被使用!

创建 XSL 样式表

创建一个带有转换模板的 XSL 样式表("cdcatalog.xsl"):

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
    <h2>My CD Collection</h2>
    <table border="1">
    <tr bgcolor="#9acd32">
      <th align="left">Title</th>
      <th align="left">Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

把 XSL 样式表链接到 XML 文档

向 XML 文档("cdcatalog.xml")添加 XSL 样式表引用:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?><!-- 引入样式文件 -->
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
.
.
.
</catalog>

主要标签:

XSLT <template>     XSLT <xsl:value-of>   XSLT <for-each>    XSLT <sort>   XSLT <if>     XSLT <choose>     XSLT apply

 

XSL-FO

XSL-FO 用于格式化供输出的 XML 数据。

什么是 XSL-FO?

  • XSL-FO 是用于格式化 XML 数据的语言
  • XSL-FO 指可扩展样式表语言格式化对象(Extensible Stylesheet Language Formatting Objects)
  • XSL-FO 是一个 W3C 推荐标准
  • XSL-FO 目前通常被称为 XSL

XSL-FO 目前通常被称为 XSL

XSL-FO 文档的结构

XSL-FO 的文档结构类似这样:

<?xml version="1.0" encoding="ISO-8859-1"?>

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

<fo:layout-master-set>
  <fo:simple-page-master master-name="A4">
    <!-- Page template goes here -->
  </fo:simple-page-master>
</fo:layout-master-set>

<fo:page-sequence master-reference="A4">
  <!-- Page content goes here -->
</fo:page-sequence>

</fo:root>

结构解释

XSL-FO 文档属于 XML 文档,因为也需要以 XML 声明来起始:

<?xml version="1.0" encoding="ISO-8859-1"?>

<fo:root> 元素是 XSL-FO 文档的根元素。这个根元素也要声明 XSL-FO 的命名空间:

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <!-- 此处是 XSL-FO 文档的内容 -->
</fo:root>

<fo:layout-master-set> 元素含有一个或多个页面模板:

<fo:layout-master-set>
  <!-- 此处是所有的页面模板 -->
</fo:layout-master-set>

<fo:simple-page-master> 元素包含一个单一的页面模板。每个模板须有一个唯一的名称(master-name):

<fo:simple-page-master master-name="A4">
  <!-- 此处是某一个页面模板 -->
</fo:simple-page-master>

一个或多个 <fo:page-sequence> 元素可描述页面的内容。master-reference 属性使用相同的名称来引用 simple-page-master 模板:

<fo:page-sequence master-reference="A4">
  <!-- 此处是页面内容 -->
</fo:page-sequence>

注释:master-reference 的值 "A4" 实际上并没有描述某个预定义的页面格式。它仅仅是一个名称。您可以使用任何名称,比如 "MyPage"、"MyTemplate" 等等。

 

XSL-FO 区域

XSL 格式化模型定义了一系列的矩形(区域)框来显示输出。

所有的输出都会被格式化到这些框中,然后会被显示或打印到某个目标媒介。

让我们研究一下下面这些区域:

  • Pages(页面)
  • Regions(区)
  • Block areas(块区域)
  • Line areas(行区域)
  • Inline areas(行内区域)

XSL-FO 页面(Page)、流(Flow)以及块(Block)

内容“块”会“流”入“页面”中,然后输出到媒介。

XSL-FO 输出通常被嵌套在 <fo:block> 元素中,<fo:block> 嵌套于 <fo:flow> 元素中,<fo:flow> 嵌套于 <fo:page-sequence> 元素中:

<fo:page-sequence>
  <fo:flow flow-name="xsl-region-body">
    <fo:block>
      <!-- Output goes here -->
    </fo:block>
  </fo:flow>
</fo:page-sequence>

XQuery

解释 XQuery 的最佳方式是:XQuery 相对于 XML,等同于 SQL 相对于数据库。

XQuery 被设计用来查询 XML 数据。

XQuery 也被称为 XML Query。

解释 XQuery 最佳方式是这样讲:XQuery 相对于 XML 的关系,等同于 SQL 相对于数据库表的关系。

XQuery 被设计用来查询 XML 数据 - 不仅仅限于 XML 文件,还包括任何可以 XML 形态呈现的数据,包括数据库。

XML 实例文档

我们将在下面的例子中使用这个 XML 文档。

"books.xml" :

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="WEB">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="WEB">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

</bookstore>

在您的浏览器中查看 "books.xml" 文件

如何从 "books.xml" 选取节点?

函数

XQuery 使用函数来提取 XML 文档中的数据。

doc() 用于打开 "books.xml" 文件:

doc("books.xml")

路径表达式

XQuery 使用路径表达式在 XML 文档中通过元素进行导航。

下面的路径表达式用于在 "books.xml" 文件中选取所有的 title 元素:

doc("books.xml")/bookstore/book/title

(/bookstore 选取 bookstore 元素,/book 选取 bookstore 元素下的所有 book 元素,而 /title 选取每个 book 元素下的所有 title 元素)

上面的 XQuery 可提取以下数据:

<title lang="en">Everyday Italian</title>
<title lang="en">Harry Potter</title>
<title lang="en">XQuery Kick Start</title>
<title lang="en">Learning XML</title>

谓语

XQuery 使用谓语来限定从 XML 文档所提取的数据。

下面的谓语用于选取 bookstore 元素下的所有 book 元素,并且所选取的 book 元素下的 price 元素的值必须小于 30:

doc("books.xml")/bookstore/book[price<30]

上面的 XQuery 可提取到下面的数据:

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

如果使用 FLWOR 从 "books.xml" 选取节点

请看下面这个路径表达式:

doc("books.xml")/bookstore/book[price>30]/title

上面这个表达式可选取 bookstore 元素下的 book 元素下所有的 title 元素,并且其中的 price 元素的值必须大于 30。

下面这个 FLWOR 表达式所选取的数据和上面的路径表达式是相同的:

for $x in doc("books.xml")/bookstore/book
where $x/price>30
return $x/title

结果是:

<title lang="en">XQuery Kick Start</title>
<title lang="en">Learning XML</title>

通过 FLWOR,您可以对结果进行排序:

for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title

FLWOR 是 "For, Let, Where, Order by, Return" 的只取首字母缩写。

for 语句把 bookstore 元素下的所有 book 元素提取到名为 $x 的变量中。

where 语句选取了 price 元素值大于 30 的 book 元素。

order by 语句定义了排序次序。将根据 title 元素进行排序。

return 语句规定返回什么内容。在此返回的是 title 元素。

上面的 XQuery 表达式的结果:

<title lang="en">Learning XML</title>
<title lang="en">XQuery Kick Start</title>

XQuery 对大小写敏感,XQuery 的元素、属性以及变量必须是合法的 XML 名称。

XQuery 的基础语法规则:

一些基本的语法规则:

  • XQuery 对大小写敏感
  • XQuery 的元素、属性以及变量必须是合法的 XML 名称。
  • XQuery 字符串值可使用单引号或双引号。
  • XQuery 变量由 “$” 并跟随一个名称来进行定义,举例,$bookstore
  • XQuery 注释被 (: 和 :) 分割,例如,(: XQuery 注释 :)

XQuery 条件表达式

"If-Then-Else" 可以在 XQuery 中使用。

请看下面的例子:

for $x in doc("books.xml")/bookstore/book
return	if ($x/@category="CHILDREN")
	then <child>{data($x/title)}</child>
	else <adult>{data($x/title)}</adult>

请注意 "If-Then-Else" 的语法:if 表达式后的圆括号是必需的。else 也是必需的,不过只写 “else ()” 也可以。

上面的例子的结果:

<adult>Everyday Italian</adult>
<child>Harry Potter</child>
<adult>Learning XML</adult>
<adult>XQuery Kick Start</adult>

XQuery 比较

在 XQuery 中,有两种方法来比较值。

  1. 通用比较:=, !=, <, <=, >, >=
  2. 值的比较:eq、ne、lt、le、gt、ge

这两种比较方法的差异如下:

请看下面的 XQuery 表达式:

$bookstore//book/@q > 10

如果 q 属性的值大于 10,上面的表达式的返回值为 true。

$bookstore//book/@q gt 10

如果仅返回一个 q,且它的值大于 10,那么表达式返回 true。如果不止一个 q 被返回,则会发生错误。

XLink 以及 XPointer

XLink 定义了一套标准的在 XML 文档中创建超级链接的方法。

XPointer 使超级链接可以指向 XML 文档中更多具体的部分(片断)。

什么是 XLink?

  • XLink 是 XML 链接语言(XML Linking Language)的缩写
  • XLink 是用于在 XML 文档中创建超级链接的语言
  • XLink 类似于 HTML 链接 - 但是更为强大
  • XML 文档中的任何元素均可成为 XLink
  • XLink 支持简易链接,也支持可将多重资源链接在一起的扩展链接
  • 通过 XLink,链接可在被链接文件外进行定义
  • XLink 是 W3C 推荐标准

什么是 XPointer?

  • XPointer 是 XML 指针文件(XML Pointer Language)的缩写
  • XPointer 使超级链接可以指向 XML 文档中更多具体的部分(片断)
  • XPointer 使用 XPath 表达式在 XML 文档中进行定位
  • XPointer 是 W3C 推荐标准

下面是在 XML 文档中使用 XLink 来创建链接的简单实例:

<?xml version="1.0"?>

<homepages xmlns:xlink="http://www.w3.org/1999/xlink">

  <homepage xlink:type="simple"
  xlink:href="http://www.w3school.com.cn">Visit W3School</homepage>
  
  <homepage xlink:type="simple"
  xlink:href="http://www.w3.org">Visit W3C</homepage>
  
</homepages>

为了访问 XLink 的属性和特性,我们必须在文档的顶端声明 XLink 命名空间。

XLink 的命名空间是:"http://www.w3.org/1999/xlink"。

<homepage> 元素中的 xlink:type 和 xlink:href 属性定义了来自 XLink 命名空间的 type 和 href 属性。

xlink:type="simple" 可创建一个简单的两端链接(意思是“从这里到哪里”)。

DTD

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>

带有 DTD 的 XML 文档实例(请在 IE5 以及更高的版本打开,并选择查看源代码):

<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

在您的浏览器中打开此 XML 文件,并选择“查看源代码”命令

以上 DTD 解释如下:

!DOCTYPE note (第二行)定义此文档是 note 类型的文档。

!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"

!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型

!ELEMENT from (第五行)定义 frome 元素为 "#PCDATA" 类型

!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型

!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD: (在 IE5 中打开,并选择“查看源代码”命令。)

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note> 

这是包含 DTD 的 "note.dtd" 文件:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

为什么使用 DTD?

通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。

通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。

而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。

您还可以使用 DTD 来验证您自身的数据。

在一个 DTD 中,元素通过元素声明来进行声明。

声明一个元素

在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:

<!ELEMENT 元素名称 类别>

或者

<!ELEMENT 元素名称 (元素内容)>

空元素

空元素通过类别关键词EMPTY进行声明:

<!ELEMENT 元素名称 EMPTY>

例子:

<!ELEMENT br EMPTY>

XML例子:

<br />

只有 PCDATA 的元素

只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:

<!ELEMENT 元素名称 (#PCDATA)>

例子:

<!ELEMENT from (#PCDATA)>

带有任何内容的元素

通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:

<!ELEMENT 元素名称 ANY>

例子:

<!ELEMENT note ANY>

带有子元素(序列)的元素

带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:

<!ELEMENT 元素名称 (子元素名称 1)>

或者

<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>

例子:

<!ELEMENT note (to,from,heading,body)>

当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。"note" 元素的完整声明是:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to      (#PCDATA)>
<!ELEMENT from    (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body    (#PCDATA)>

声明只出现一次的元素

<!ELEMENT 元素名称 (子元素名称)>

例子:

<!ELEMENT note (message)>

上面的例子声明了:message 子元素必须出现一次,并且必须只在 "note" 元素中出现一次。

声明最少出现一次的元素

<!ELEMENT 元素名称 (子元素名称+)>

例子:

<!ELEMENT note (message+)>

上面的例子中的加号声明了:message 子元素必须在 "note" 元素内出现至少一次。

声明出现零次或多次的元素

<!ELEMENT 元素名称 (子元素名称*)>

例子:

<!ELEMENT note (message*)>

上面的例子中的星号声明了:子元素 message 可在 "note" 元素内出现零次或多次。

声明出现零次或一次的元素

<!ELEMENT 元素名称 (子元素名称?)>

例子:

<!ELEMENT note (message?)>

上面的例子中的问号声明了:子元素 message 可在 "note" 元素内出现零次或一次。

声明“非.../既...”类型的内容

例子:

<!ELEMENT note (to,from,header,(message|body))>

上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。

声明混合型的内容

例子:

<!ELEMENT note (#PCDATA|to|from|header|message)*>

上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。

声明属性

属性声明使用下列语法:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

DTD 实例:

<!ATTLIST payment type CDATA "check">

XML 实例:

<payment type="check" />

DTD - 实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

实体引用是对实体的引用。

实体可在内部或外部进行声明。

XML 例子:

<author>&writer;&copyright;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

Schema

XML Schema 是基于 XML 的 DTD 替代者。

XML Schema 描述 XML 文档的结构。

XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。

 

XForms

XForms 是下一代的 HTML 表单。

XForms 使用 XML 来创建 web 上的输入表单。

 

XForms 模型为集中于表单中的数据定义了一个模板。

XForms 框架

HTML 表单的作用是搜集数据。XForms 的作用是相同的。

通过 XForms,输入数据被描述在两个不同的部分中:

  • XForms 模型(描述数据和逻辑)
  • XForms 用户界面(显示和输入数据)

XForms 模型定义了什么是表单,它包含什么数据,以及它应该做什么。

XForms 用户界面定义了输入域,以及它们如何被显示。

XForms 模型

XForms 模型用于描述数据。

数据模型是 XML 文档的一个实例(一个模板)。

XForms 模型定义了一个 <model> 元素内部的一个数据模型:

<model>

<instance>
  <person>
    <fname/>
    <lname/>
  </person>
</instance>

<submission id="form1" action="submit.asp" method="get"/>

</model>

从上面的例子,您可以看到 XForms 模型使用 一个 <instance> 元素来为需要收集的数据定义 XML 模板,并使用一个 <submission> 元素来描述如何提交数据。

<submission> 模型没有表达任何有关表单可见部分(用户界面)的信息。

XForms 命名空间

假如您忽略了这些例子中的 XForms 命名空间,或者假如您不清楚命名空间的概念,我们会在下一节介绍这个内容。

<instance> 元素

XForms 模型 <instance> 元素来定义数据收集的数据。

XForms 是为某个 XML 文档进行数据收集的。在这个 XForms 模型中的 <instance> 元素定义了这个 XML 文档。

在上面的例子中,表单为其收集数据的数据实例(XML 文档)类似这样:

<person>
  <fname/>
  <lname/>
</person>

在数据收集完毕后,这个 XML 文档也许看上去类似这样:

<person>
  <fname>John</fname>
  <lname>Smith</lname>
</person>

<submission> 元素

XForms 模型使用 <submission> 元素来描述如何提交数据。

<submission> 元素可定义表单以及如何提交表单。在上面的例子中,id="form1" 用于标示此表单,action="submit.asp" 属性表单被提交到的 URL,而 method="get" 属性定义了在表单提交过程中使用的方法。

XForms 用户界面

XForms 用户界面用于显示和输入数据。

XForms 的用户界面元素被称为控件或输入控件:

<input ref="fname"><label>First Name</label></input>
<input ref="lname"><label>Last Name</label></input>
<submit submission="form1"><label>Submit</label></submit>

在上面的例子中,两个 <input> 元素定义了两个输入域。ref="fname" 和 ref="lname" 属性指向了 XForms 模型中的 <fname> 和 <lname> 元素。

<submit> 元素中的 submission="form1" 属性可引用 XForms 模型中的 <submission> 元素。submit 元素通常被显示为按钮。

请留意例子中的 <label> 元素。使用 XForms 的话,每个输入控件元素都必须有 <label> 元素。

您将需要一个容器

XForms 没有被设计为单独工作的方式。也没有所谓的 XForms 文档。

XForms 必须工作在另外一个 XML 文档中。它可运行在 XHTML 1.0 中,同时它也将工作在 XHTML 2.0 中。

现在把所有的组合起来

如果我们把它组合起来,此文档是这样的:

<xforms>

<model>
<instance>
  <person>
    <fname/>
    <lname/>
  </person>
</instance>
<submission id="form1"
action="submit.asp"
method="get"/>
</model>

<input ref="fname"><label>First Name</label></input>
<input ref="lname"><label>Last Name</label></input>
<submit submission="form1"><label>Submit</label></submit>

</xforms>

页面会这样显示:

xforms_example

XForms 处理器

内建于浏览器中的 XForms 处理器将负责向目标提交 XForms 数据。

数据可作为 XML 来提交,类似这样:

<person>
  <fname>David</fname>
  <lname>Smith</lname>
</person>

或作为文本来提交,类似这样:

fname=David;lname=Smith

XML DOM

XML DOM 定义了访问和处理 XML 文档的标准方法。

XML DOM 是 XML Document Object Model 的缩写,即 XML 文档对象模型。

SOAP

SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。

或者更简单地说:SOAP 是用于访问网络服务的协议。

什么是 SOAP?

  • SOAP 指简易对象访问协议
  • SOAP 是一种通信协议
  • SOAP 用于应用程序之间的通信
  • SOAP 是一种用于发送消息的格式
  • SOAP 被设计用来通过因特网进行通信
  • SOAP 独立于平台
  • SOAP 独立于语言
  • SOAP 基于 XML
  • SOAP 很简单并可扩展
  • SOAP 允许您绕过防火墙
  • SOAP 将被作为 W3C 标准来发展

SOAP 构建模块

一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:

  • 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
  • 可选的 Header 元素,包含头部信息
  • 必需的 Body 元素,包含所有的调用和响应信息
  • 可选的 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 元素

    可选的 SOAP Header 元素可包含有关 SOAP 消息的应用程序专用信息(比如认证、支付等)。如果 Header 元素被提供,则它必须是 Envelope 元素的第一个子元素。

WSDL

WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。

WSDL 是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言。

什么是 WSDL?

  • WSDL 指网络服务描述语言
  • WSDL 使用 XML 编写
  • WSDL 是一种 XML 文档
  • WSDL 用于描述网络服务
  • WSDL 也可用于定位网络服务
  • WSDL 还不是 W3C 标准

WSDL 文档仅仅是一个简单的 XML 文档。

它包含一系列描述某个 web service 的定义。

WSDL 端口可描述由某个 web service 提供的界面(合法操作)。

WSDL 端口

<portType> 元素是最重要的 WSDL 元素。

它可描述一个 web service、可被执行的操作,以及相关的消息

端口定义了指向某个 web service 的连接点。可以把该元素比作传统编程语言中的一个函数库(或一个模块、或一个类),而把每个操作比作传统编程语言中的一个函数。

Web Services

Web Services 可以将应用程序转换为网络应用程序。

通过使用 Web Services,您的应用程序可以向全世界发布信息,或提供某项功能。

Web Services 可以被其他应用程序使用。

通过 Web Services,您的会计部门的 Win 2k 服务器可以与 IT 供应商的 UNIX 服务器相连接。

基本的 Web Services 平台是 XML+HTTP。

Web services 使用 XML 来编解码数据,并使用 SOAP 来传输数据。

最重要的事情是协同工作

由于所有主要的平台均可通过 Web 浏览器来访问 Web,不同的平台可以借此进行交互。为了让这些平台协同工作,Web 应用程序被开发了出来。

Web 应用程序是运行在 Web 上的简易应用程序。它们围绕 Web 浏览器标准被进行构建,几乎可被任何平台之上的任何浏览器来使用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2013-04-25 12:00  zcjava  阅读(206)  评论(0编辑  收藏  举报