第 14章 XML 技术
14,1 XML 技术
14,2 XML 文档与数据库表
14,1 XML 技术任何一个文档都由三部分组成,即文档数据,文档结构和文档样式 。 在 HTML文档三者合为一体,而 XML文档则只包括文档数据,文档结构由数据类型定义 ( DTD) 或
XML模式 ( XML Schema) 确定,并进行合法性检验,文档样式由可扩展样式表语言 ( XSL) 确定,XSL能够将
XML文档从一种 XML形式转化为另一种 XML形式,或把
XML文档转化为大家所熟悉的 HTML格式 。
返回目录
14.1.1 XML 文档
1,一个简单的例子
【 例 14.1】 一个简单的 XML文档
<?xml version="1.0" encoding="GB2312"?>
<地址 >
<姓名 >
<姓 >李 </姓 >
<名 >中国 </名 >
</姓名 >
<省 >广东省 </省 >
<城市 省 ="广东 ">广州 </城市 >
<街道 >
北京路 15号
</街道 >
<邮政编码 >
514000
</邮政编码 >
</地址 > 返回目录该文档的第 1行是 XML声明 —— 定义此文档所遵循的 XML标准的版本,在这个例子里是 1.0版本的标准,使用的是 GB2312字符集。文档的第 2行是根元素(地址),文档的最后一行是根元素的结束。 文档的中间部分描述了根元素的子节点(姓名,省,城市,街道,邮政编码),其中姓,名为姓名节点的子节点。
所有 XML文档都必须符合下列规则:
( 1) XML文档必须有一个根元素,XML文档中的第一个元素就是根元素,XML文档有且只能有一个根元素,XML文档都必须包含一个单独的标记来定义,所有其他元素的都必须成对的在根元素中嵌套;
( 2) 所有的 XML元素必须合理包含
( 3) XML标记都是大小写敏感的
( 4) 所有的 XML文档必须有一个结束标记 。
返回目录
2,XML 文档的基本结构返回目录
【 例 14.2】 一个比较全面完整的 XML文档
1,<?xml version="1.0" encoding="UTF-8"?>
2,<?xml-stylesheet type="text/xsl" href="show_book.xsl"?>
3,<!DOCTYPE catalog SYSTEM "catalog.dtd">
4,<!--catalog last updated 2003-11-01-->
5,<catalog xmlns="http://localhost/catalog/">
6,<book id="bk101">
7,<author>&#71;Abercrombie,kim</author>
8,<title>XML Developer's &#x47;uide</title>
9,<genre>Computer</genre>
10,<price>44.95</price>
11,<publish_date>2000-10-01</publish_date>
12,<description><![CDATA[An in-depth look at creating
applications with XML,using <,>,]]> and &amp;.</description>
13,</book>
14,</catalog> 返回目录
( 1) 序言:文档开始至根元素之前,
( 2) 元素:元素是 XML文档的主体 。 标记是左尖括号 ( <) 和右尖括号 ( >) 之间的文本 。
( 3) XML声明,XML声明必须出现在 XML文档的第一行,包括版本,编码声明和独立性声明 (可选 )。
( 4) 处理指令,处理指令是为使用一段特殊代码而设计的标记 。
( 5) DOCTYPE声明:例 14.2的 第 3行声明了根元素和文档类型定义 ( DTD) 参考一个外部文件 。
( 6) 注释,注释是不需要解析的说明部分,其格式为,<!--
注释的内容 -->,如例 14.2的第 4行 。
( 7) CDATA部分,CDATA部分把文本块和 XML解析器分开,
使 XML解析器忽略标记的内容 。
( 8) 字符和实体引用
( 9) 名称空间,可以用名称空间来区分元素名,避免名字冲突 。 返回目录
14.1.2 数据类型定义
1,文档类型定义( DTD)
文档类型定义( DTD)可以在 XML 文档中出现的元素、这些元素出现的次序、它们可以如何相互嵌套以及 XML 文档结构的其它详细信息。
一个元素声明的结构如下:
<!ELEMENT elementName (内容模型 )>
以 <!ELEMENT开始,后面跟着元素名字,可以为例 14.1建立文档类型定义文件如下:
<!ELEMENT 地址 (姓名,省,城市,街道,邮政编码 )>
<!ELEMENT姓名 (姓,名 )>
<!ELEMENT姓 (#PCDATA)>
<!ELEMENT名 (#PCDATA)>
<!ELEMENT省 (#PCDATA)>
<!ELEMENT城市 (#PCDATA)>
<!ELEMENT街道 (#PCDATA)>
<!ELEMENT邮政编码 (#PCDATA)> 返回目录其内容模型说明,如果元素包含了任何子元素,就在括号中列出,例如:地址 (姓名,省,城市,街道,邮政编码 )。 #PCDATA 代表已解析字符数据;不能在这些元素中包含另一个元素。 DTD 中的后缀符号:
问号 (?)表示这一项是可选的,它可以出现一次或根本不出现。加号 (+)
表示这一项必须至少出现一次,但可出现任意次。 星号 (*)表示这一项可以出现任意次,包括零次。 (空 )这个元素只能存在一次。 例如
<!ELEMENT addressbook (address+)> 表示元素 address必须至少出现一次,但可出现任意次。
( 1) DTD属性一个 DTD属性声明结构如下:
<!ATTLIST 元素名 属性名 类型 缺省声明 >
( 2)缺省声明:
2,XML 模式 ( Schema)
DTD并不是唯一可以存储 XML文档规则的文档类型 。 有一系列的标准提交 W3C组织,所有这些标准都被称为 XML 模式 。 与 DTD一样,
XML 模式用来验证 XML文档的有效性 。
返回目录
14.1.3 XML 文档转换可扩展样式表语言转换 ( XSLT) 通过样式表将一类 XML文档转为其他形式,结构和类型的 XML文档或其他类型的文档 ( 例如,HTML文档 ) 。
XSLT描述了将源文档树转变为目标树的规则,构造目标树是通过模式匹配和模板来完成的 。
1,XSLT常用的元素
xsl:template,设计模块语法,<xsl:templatematch="节点环境 "language="脚本语言名称 "
match:匹配条件,最上层模板设为 "/",language:缺省为 Jscript.
xsl:apply-templates:调用模块语法,<xsl:apply-templates select="模式 " order-by="排序列表 ">
xsl:value-of:提取指定节点的数据语法,<xsl:value-of select="模式 ">
select指定要提取的对象
xsl:for-each:循环获取节点的内容,
语法,<xsl:for-each select="模式 " order-by="排序列表 ">
xsl:if:用来封装一个模板体,只在语句检查为真时使用 。 返回目录语法,<xsl:iftest="条件表达式 ">
xsl:choose:与 xsl:otherwise和 xsl:when一起使用提供条件检查 。
【 例 14.3】 xsl:choose示例当价格小于等于 20时显示普通字体,大于 30时显示斜体字体,否则显示粗体 。
<xsl:choose>
<xsl:when test="price[.$le$20]">nomal
</xsl:when>
<xsl:when test="price[.$gt$30]">italic
</xsl:when>
<xsl:otherwise>bold</xsl:otherwise>
</xsl:choose>
xsl:element在输出结构中指定的名字创建一个元素,
语法,<xsl:element name="插入的元素名 ">
xsl:attribute将来属性插入到输出文档中,
语法,<xsl:attributename="插入的元素名 "> 返回目录
2,常用的运算符
/ 选择子元素,// 引用任意级别的后代元素,,表示当前元素,* 通配符,选择任意元素,@ 取得属性值,$eq$ 相等,
$ne$ 不等,$lt$ 小于,$le$ 小于等于 $gt$ 大于,$ge$ 大于等于,$all$ 全部,$any$ 任意 | 两个集合的联合 。 and 逻辑与,or 逻辑或,not() 逻辑非 。
3,XML文档转换为 HTML文档下面以简单的例子说明 XML文档转换为 HTML文档的方法 。
首先分析 XML文档的元素结构,考虑 HTML输出文档的布局,设计 XML文档的输出规则,针对例 14.1的 XML文档设计下列的 XSL文件,并保存在与 XML文档相同的目录下,命名为 doc.xsl.
【 例 14.4】 doc.xsl.代码返回目录
SQL Server 具有支持 XML功能的特性,使 SQL Server成为可支持 XML的数据库服务器 。 SQL Server可以返回 XML格式的数据 。
14.2.1 检索 XML数据
1,For XML子句通过 For XML子句允许调用者把查询结果以 XML文档的形式返回,生成的 XML文档结构取决于调用者选择的 XML模式 ( Auto | Raw | Explicit)
FOR XML 子句的基本语法:
FOR {XML {Auto | Raw | Explicit} [,XMLDATA] [,ELEMENTS][,BINARY
BASE64]}
XML 模式,XML 模式决定所得到的 XML 的形式 。
XMLDATA:指定应返回 XML-Data 架构 。 文档的架构被预先设计为内嵌式架构 。
ELEMENTS:如果指定 ELEMENTS选项,则列作为子元素返回 。
BINARY BASE64:如果指定 BINARY Base64 选项,则查询所返回的任何二进制数据都用 base64编码格式表示 。 返回目录
14.2 XML 文档与数据库表
2,AUTO 模式
AUTO 模式将查询结果作为嵌套 XML 元素返回,在
FROM 子句内,每个在 SELECT 子句中至少有一列被列出的表都表示为一个 XML 元素 。 SELECT 子句中列出的列映射到适当的元素特性 。 当指定了 ELEMENTS 选项后,
表列映射到子元素而非特性 。
【 例 14.5】 AUTO 模式查询
3,RAW 模式
RAW 模式将查询结果集中的每一行转换为带有类属标识符 row 的 XML 元素 。 非 NULL 的任何列值均被映射到
XML 元素的特性,该元素中的特性名与列名相同 。
【 例 14.6】 RAW 模式查询返回目录
4,Explicit模式
Explicit模式允许指定 XML文档的所有细节,包括形式和数据,必须保证 XML文档是结构良好的和有效的 。 这需要编写 SELECT 查询以生成具有特定格式的通用表,可对该通用表进行处理以生成请求的 XML 文档 。
EXPLICIT 模式首先要求查询生成两个元数据列:在
SELECT 子句中指定的第一列必须是命名 (Tag) 标记号 。。
指定的第二列必须是父元素的命名 (Parent) 标记号 。
例如,生成下列一个通用表
【 例 14.7】 EXPLICIT 模式查询
14.2.2 通过 HTTP查询数据库的 XML文档
1,配置工作环境
2,通过 HTTP查询数据库信息当配置好工作环境后,可以使用下列方法查询数据库信息的 XML文档 。 返回目录
( 1) 直接在浏览器地址栏输入查询语句语法,http://<服务器名 >/<虚拟目录名 >?sql=<SQL查询语句 >< FOR XML子句 >&root=ROOT
【 例 14.8】 直接在浏览器地址栏输入查询语句例如本地服务器名为 lundw2ks,虚拟目录名为 testxml,FOR
XML子句采用 AUTO模式 。
( 2) 通过 HTTP执行存储过程
SQL SERVER支持通过 HTTP执行存储过程,可以建立存储过程包含复杂的查询,然后通过 HTTP执行存储过程,
获得查询结果的 XML文档 。
语法,http://<服务器名 >/<虚拟目录名 >?sql=execute <存储过程名 >&root=ROOT
【 例 14.9】 通过 HTTP执行存储过程首先在目标数据库创建存储过程,名为 test_sp
返回目录
( 3) 使用模板访问数据库模板文件是一个 XML文档,包含了所有的有关信息,例如 For XML查询,参数和 XSL转换文件等 。
XML模板的语法:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"
sql:xsl='XSL FileName' >
<sql:header>
<sql:param>..</sql:param>
<sql:param>..</sql:param>...n
</sql:header>
<sql:query>
sql statement(s)
</sql:query>
<sql:xpath-query mapping-schema="SchemaFileName.xml">
XPath query
</sql:xpath-query>
</ROOT> 返回目录模板中的任何元素都是可选的,必须在命名空间中声明:
xmlns:sql="urn:schemas-microsoft-com:xml-sql"。
<ROOT>:此标记以提供所得到的 XML 文档的根元素,
<ROOT> 标记可以是任何名称 。
<sql:header>:此标记用于保存所有标题值 。
<sql:param>:该元素用于定义在模板内传递到查询的参数 。
<sql:query>:该元素用于指定 SQL 查询 。
<sql:xpath-query>:该元素用于指定 XPath 查询 。
sql:xsl:该特性用于指定将应用于所得到的 XML 文档的可扩展样式表语言 (XSL) 样式表 。
mapping-schema:该特性用于标识带批注的 XDR 架构 。
【 例 14.10】 使用模板访问数据库返回目录