XML碎片
1 XML是移动和操作结构化数据的最佳方法,该如何开始使用 XML呢?下面是一些建议:
确定您要将什么数据转换成 XML。通常这是需要从一个系统移到另一个系统的数据,或必须转换成不同格式的数据。
了解是否有现有的 XML 标准。如果您正在研究很常见的数据,例如采购订单、医疗记录或股票报价,则很可能已经有人为那些数据定义了 XML 标准。
了解您现有的工具是否支持 XML。如果您正在使用数据库软件包、电子表格或其它数据管理工具的最新版本,则您的现有工具(或其升级版本)很可能可以使用 XML 作为输入或输出格式。
学习如何构建基于 XML 的应用程序。您需要理解您的数据现在是如何存储的,需要如何转换它,以及如何将您的 XML 开发工作与现有的应用程序集成起来。
避免专有产品的诡计。在开发工作中仅使用基于标准的技术很重要;抵制为您提供所谓改进的供应商的诱惑。XML 的优点之一是您对数据有完全的控制权。一旦它受到某个专有数据格式的限制,您就失去了极大的控制权。
2 三种 XML 文档:
无效文档:没有遵守 XML 规范定义的语法规则。如果开发人员已经在 DTD 或模式中定义了文档能够包含什么,而某个文档没有遵守那些规则,那么这个文档也是无效的。
格式良好的文档:遵守 XML 语法,但没有 DTD 或模式。
有效文档:既遵守 XML 语法规则也遵守在其 DTD 或模式中定义的规则。
3 名称空间定义中的字符串仅仅是字符串。这些字符串看似 URL,其实不是。您可以定义 xmlns:addr="mike",那也是有效的。名称空间唯一的重要性在于其唯一性;这就是为什么大多数名称空间定义看起来象 URL 的原因。XML 解析器不会到诸如http://www.zyx.com/books/ 去搜索 DTD 或模式,它只是把那个文本作为字符串使用。
注意到默认名称空间和根本没有名称空间之间的巨大区别是很重要的。没有指定名称空间的任何节点都在默认名称空间中。当不存在默认名称空间时,那些元素就不在任何名称空间中。
您还可以创建次级名称空间,并向它们添加元素或属性。名称空间连同别名通常在文档的根元素上(但不一定是这样)创建。当正在使用多个名称空间时,这个别名根据需要用作元素或属性的前缀,以指定正确的名称空间。即是说属性也可能属于某个特定的名称空间。
<surveys xmlns="http://www.nicholaschase.com/surveys/"
xmlns:revised="http://www.nicholaschase.com/surveys/revised/">
<response username="bob">
<question subject="appearance">A</question>
<question subject="communication">B</question>
<revised:question subject="appearance">D</revised:question>
<revised:question subject="communication" revised:subject="looks">A</revised:question>
</response>
<response username="sue">
它使用了名称空间和别名 revised
来创建 question
元素,添加相关的属性 revised:subject
。记住 revised:
不是名称空间,而是别名!实际的名称空间是 http://www.nicholaschase.com/surveys/revised/
。
关于属性的稍微有点奇怪的地方在于,它们 永远不会 在默认名称空间中。即使已经声明了一个默认名称空间,没有前缀的属性也被认为是根本就没有名称空间。这意味着 response
在 http://www.nicholaschase.com/surveys/
名称空间中,但是其属性 username
却不在该名称空间中。
URI和URL有什么不同?
URI是统一资源标识符(Uniform Resource Identifier)的缩写,URL是统一资源定位符(Uniform Resoure Locator)的缩写,另外还有URN也经常使用,它是统一资源名称(Uniform Resource Name)的缩写。URL是通过"通讯协议+网络地址"字符串来唯一标识信息位置及资源访问途径的一种方法;URN则主要用于唯一标识全球范围内由专门机构负责的稳定的信息资源,URN通常给出资源名称而不提供资源位置;URI是一种用字符串唯一标识信息资源的工业标准(RFC2396),它使用的范围及方式都较为广泛,在XML中用URI引用来标识元素的命名空间(Namespace),URI包括了URL和URN,是二者的超集。
4 standalone定义了是否可以在不读取任何其它文件的情况下处理该文档。如果 XML 文档没有引用任何其它文件,则您可以指定 standalone="yes"。如果 XML 文档引用其它描述该文档可以包含什么的文件,则您可以指定 standalone="no"。因为 standalone="no" 是缺省的,所以您很少会在 XML 声明中看到 standalone。
XML 声明采用如下的形式:
|
XML 的基础是 Unicode。XML 文档中的的每个字符都是 Unicode 字符。如果您对 XML 只记住一件事,那么就应该是它。这一点甚至比其他事情都更重要,比方说,所有非空元素必须有起始标签和结束标签。因为 Unicode 字符是一种抽象,必须有一种机制以可由计算机处理的形式来真正表示这些字符。这种形式称为编码。文档编码只是为了方便文档的传输,必须明确 XML 内容在实质上仍然是严格的 Unicode。把编码转换成 Unicode 是解析器的工作。
5 定义用来表示数据的元素两种方法:
一种方法是使用文档类型定义(Document Type Definition),或简称 DTD。DTD 定义可以在 XML 文档中出现的元素、这些元素出现的次序、它们可以如何相互嵌套以及 XML 文档结构的其它详细信息。DTD 是最初的 XML 规范的一部分,与 SGML DTD 非常相似。
另一种方法是使用 XML Schema。模式可以定义您能在 DTD 中使用的所有文档结构,它还可以定义数据类型和比 DTD 更复杂的规则。
要点:如要定义一个 XML 文档的结构,您应该象在应用程序中设计数据库模式或数据结构那样事先考虑 DTD 或模式。您事先考虑的未来需求越多,以后实现它们就越容易而且成本越低。
请注意,DTD 语法不同于普通的 XML 语法。相反,XML Schema 文档本身就是 XML。使用 XML 模式,您会有更多的能力来定义什么样的 XML 文档是有效的。它与 DTD 相比有几个优势:
XML 模式使用 XML 语法。换句话说,XML 模式是一个 XML 文档。这意味着您可以象处理任何其它文档一样处理模式。例如,您可以编写一个 XSLT 样式表,该样式表将 XML 模式转换成具有自动生成的 JavaScript 代码的 Web 表单,其中的 JavaScript 代码可以验证您输入的数据。
XML 模式支持数据类型。尽管 DTD 确实支持数据类型,但很明显这些数据类型是从发布的角度开发的。XML 模式支持 DTD 中的所有原始数据类型(诸如标识和标识引用之类的类型)。它们还支持整数、浮点数、日期、时间、字符串、URL 和其它对数据处理和验证有用的数据类型。
XML 模式是可扩展的。除了 XML 模式规范中定义的数据类型以外,您还可以创建自己的数据类型,并且可以基于其它数据类型派生出新的数据类型。
XML 模式有更强的表达能力。例如,您可以用 XML 模式定义任何 <state> 属性值不得超过 2 个字符,或定义任何 <postal-code> 元素的值必须与正则表达式 [0-9]{5}(-[0-9]{4})? 相匹配。您无法用 DTD 做这些事。
6 在 Web 上传输,必须压缩 XML 吗?
一般来说,压缩 XML 的需要是与应用程序有关的,并且很大程度上是服务器和客户机之间移动数据量的函数。用于描述数据结构的标记的反复特性,使 XML 能够非常好地压缩数据。值得注意的是 HTTP 1.1 服务器和客户机的压缩都是标准的,XML 可以自动从中受益。
7 XML 作为数据格式有多安全?有没有增加 XML 安全性的计划?
XML 和 HTML 一样安全。正因为安全的 HTTP (HTTPS) 可以用于对 HTTP 添加密码技术,从而保护了 HTML,因此它也可以用于保护 XML。XML 是表示结构化数据的基于文本格式。这可以使数据的简单性和互操作性最大化。对 XML 格式增加安全性和验证能力时可以采取许多步骤。首先,XML 可以在传输到客户之前在服务器上加密,然后在客户机上解密。应用于数据本身的数字签名也可以验证 XML。
8 公司可以使用 XML 来创建独立于系统的数据格式。XML 文档可以表示那些可以从一个系统或过程移到另一个的结构化数据。当前端和后端应用程序更改时,XML 可以在它们之间移动而保持不变。更妙的是,当越来越多的前端和后端应用程序添加进来时,XML 的使用将现有应用程序与任何更改都隔离起来。当 Web 服务变得越来越普遍时,XML 还将用来传输数据。
9 如何在XML中实现对二进制数据(如图象、声音文件)的封装?
通常有两种方法可以实现,第一种采用(外部的)未解析通用实体,如
|
10 XML元素和元素属性
一个XML元素包括开始标签和结束标签以及它们之间的内容,可动态扩展,有父子关系或兄弟关系。一个元素的内容可以为空。
命名一个元素的要求:不能以数字、标点和XML(三个字符的大小组合,顺序不变)开头,不能有空格,由字母、数字或其它符构成的字符串。
不建议含有-或.或:或非英语字符,建议名字长度不要太长且要用描述性。
元素开始标签中可以含有属性,用以补充说明元素,但属性的值可以用来描述数据内容,但尽量不要这么用而尽可能地用子元素来完成这个任务。
用属性存放数据有以下弊端:不能含有多个值,不易扩展、不能描述数据结构、程序难以处理、不能用DTD来进行检查。
这个有一个例外,就是ID或名,可以放在属性里。
11 XPATH位置路径有相对和绝对两种类型。
相对位置路径由使用 /
分隔的定位步序列组成。比如:list/item[currentPrice<20.0]
这个位置路径由两个定位步组成:首先 list
选择和上下文节点有关的一组节点,然后 item[currentPrice<20.0]
在第一步所标识的子集中再选择一组节点;如果还有更多的节点也依此类推。
绝对位置路径由 /
和后面可选的相对位置路径组成,其中 /
表示根节点。绝对位置路径基本上就是在根节点上下文中计算的相对位置路径,比如:/list/item[currentPrice<20.0]
对于绝对位置路径(以 /
开始的位置路径),上下文节点是没有意义的,因为路径总是从根节点开始计算。
12 XPath 定义以下运算符:
=
表示“等于” !=
表示“不等于” <
表示“小于” <=
表示“小于等于” >
表示“大于” >=
表示“大于等于”
XML 文档中包含 XPath 表达式时,必须遵循 XML 1.0 的结构良好性规则,任何 <
或 <=
字符必须分别用 <
和 <=
表示。比如,XPath 表达式 bidIncrement < 5
在 XPointer 中是合法的,但是在 XSLT 文档中必须写成 bidIncrement < 5
。
Operator | Description | Example | Result |
or | or | price=9.80 or price=9.70 | true (if price is 9.80) |
and | and | price<=9.80 and price=9.70 | false |
13 XPath 数字是 64 位双精度浮点数。XPath 数字包括“非数字”
NaN
值、正无穷和负无穷、正零和负零。XPath 提供的数值运算符有:
+
(加)、-
(减)、*
(乘)、div
(除)和 mod
(整除求余)。提示:减法(
-
)运算符的前面必须有空格,因为 XML 允许字符串中包含“-
”字符。星号(
*
)可以被解释成通配符或者乘法字符。XPath 定义了词法规则以消除这种歧义。但是,除法字符引入了新的运算符 div
,因为,反斜杠(/
)用于分隔定位步。14 如果XML文档中的XPath 字符串包含引号,可以选择:
分别使用
'
或 "
引起来。比如,description = 'New 256m "USB" MP3 player'
。 如果表达式用双引号(
"
)包围起来,则在表达式中使用单引号('
),反之亦然。比如,'New 356m "USB" MP3 player'
。 15
//cd selects all the cd elements in the document
* select unknown XML elements
/*/*/price selects all price elements which have 2 ancestors
//* selects all elements in the document
the | operator in an XPath expression you can select several paths