Xml简介_动力节点Java学院整理
xml(简介)
xml(可扩展标记语言)在 20 世纪 90 年代后期登上舞台后,就一直是众多活动和*思索的焦点。xml 只是基于普通文本,但却提供了几乎可以在任何两个应用程序间共享数据的方式。
虽然 xml 在概念上很简单,但对 xml 的处理却通常很烦琐(需要编写大量重复性的代码)和复杂(很多容易被忽视的细节导致错误)。
什么时候使用 xml?
什么时候在web 应用程序中使用 xml?
- 你需要处理已经保存在 xml 中的数据时。
- 你希望用 xml 保存数据并为将来可能的整合做准备时。(xml 在应用程序整合的场景中最有意义)
- 你希望使用依赖于 xml 的技术时。(web 服务使用各种建立在 xml 上的标准)
- 注解:
- 必须理解的一个重要概念是,存储数据时必须决定两件事情:
- 确定数据结构化的方式(逻辑格式)
- 确定数据保存的方式(物理存储)
xml 是格式的选择而不是存储的选择。也就是说,即使你决定用 xml 保存数据,你还要决定是保存到数据库字段里,还是要插入到一个文件里,或者只是以字符串或其他对象的形式保存在内存中。
xml 简介
xml 规范是由 w3c(world wide web consortium)定义的一组指南,用于以纯文本的形式描述结构化数据,一种基于尖括号间标签的标记语言。
xml 没有一组固定的标签。相反,xml 是一种可用于创建其他标记语言的元语言。
下面的文档显示一个保存产品类别的自定义 xml 格式:
<?xml version="1.0" encoding="utf-8" ?> <productcatalog> <catalogname>acme fall 2015 catalog</catalogname> <expirydate>2015-01-01</expirydate> <products> <product id="1001"> <productname>magic ring</productname> <productprice>342.10</productprice> <instock>true</instock> </product> <product id="1002"> <productname>flying carpet</productname> <productprice>982.99</productprice> <instock>true</instock> </product> </products> </productcatalog>
标签可以*使用最能描述你的数据的任意名称,正是这种灵活性使得 xml 非常成功。当然,灵活性也会有缺点。不同公司完全可用不同的标签名来描述相似的数据,尽管所有应用程序都能够解析 xml 数据,但数据的写入者和读取者需要对标签和结构达成共识,才能使读取者可用解释数据并抽取有意义的信息。
xml 的优点
今天,xml 比过去任何一天都更为有用。现代应用程序使用 xml 的好处有以下几点:
- 适应性。xml 无处不在,无论什么时候需要共享数据,xml 都会成为首选目标。
- 扩展性和灵活性。xml 不会强加任何数据语义的规则,适用于任意数据的类型并且实现的代价很低。
- 相关标准和工具。xml 成功的另一个原因在于创建和处理 xml 的工具(解析器)和相关标准(xml架构、xpath、xslt)。这样几乎每种语言的开发者都有现成的组件用于阅读 xml,按某种规则(被称作架构)验证 xml 的有效性,将 xml 转换格式等。
格式良好的 xml
xml 是一个非常严格的标准,这种严格性是用于保留广泛的兼容性的。(臭名昭著的 html 语言就是在没有这种严格性标准下的产物)
所有的 xml 解析器都会执行一些基本的质量检查。如果一个 xml 文档不能满足所有标准,它就会被彻底拒绝。否则,它就被认为是格式良好的。格式良好的 xml 未必就是正确的 xml ,例如含有错误数据,但 xml 解析器能够解析它。
xml 文档必须满足下面这些条件才能被认为是格式良好的:
- 每个开始标签必须有一个对应的结束标签
- 空元素必须以“/>”结束
- 元素可以嵌套但不能交错
- xml 是严格区分大小写的,因此 <firstname> 和 </firstname > 不能配对
- 一个元素不能有两个或更多的同名特性,但是可以嵌套多个同名的元素
- 一个文档只可以有一个根元素
- 所有特性在值的前后都要有引号
- 注释不能放入标签中(它们包含在 <!-- 和 --> 标记中)
xml 命名空间
随着 xml 标准的成长,已创建了数十种 xml 标记语言(通常叫做 xml 语法)。其中很多属于特定的行业、流程和信息类型。如果你需要同时组合两个具有相同名称元素的 xml 语法,会发生什么呢?另一个更典型的问题是如何区分它们?
解决办法在于 xml 命名空间标准。这个标准的核心思想是所有的 xml 标记语言都拥有能够唯一区分相关元素的命名空间。简单的说,命名空间可以在整合时消除同名元素的歧义。
所有的 xml 命名空间都使用 uri(universal resource identifiers,统一资源标识符),一般看起来和网页的 url 相似。例如,http://www.mycompany.com/mystandard 是一种典型的命名空间,但这不是必要的(也不应该被假设),命名空间可以是任意文本序列,标准是为了确保它的唯一性。
要指定某个元素属于特定的命名空间,只需在开始标签中加入 xmlns(xml name space)特性表明要使用的命名空间即可。例如,下面这个元素是http://mycompany/orderml 命名空间的一部分。
<order xmlns="http://mycompany/orderml"></order> 你一定会厌倦在所有元素上加入这个特性的烦琐操作,幸好,如果像下面这样加入命名空间,它会成为所有子元素默认的命名空间: <product xmlns="http://mycompany/orderml"> <productname>flying carpet</productname> <productprice>982.99</productprice> <instock>true</instock> </product> 你还可以自定义命名空间前缀,在 xmlns 特性中插入一个冒号和一个你想用作前缀的字符: <ord:order xmlns:ord="http://mycompany/orderml" xmlns:cli="http://mycompany/clientml"> <cli:client> <cli:firstname>...</cli:firstname> <cli:lastname>...</cli:lastname> </cli:client> <ord:orderitem>...</ord:orderitem> <ord:orderitem>...</ord:orderitem> </ord:order>
xml 架构
xml 的灵活性也带来了一些问题。世界各地的开发人员都使用你的 xml 格式,怎样才能保证所有人都遵守规则?
解决办法是创建一个格式文档,它定义你的自定义标记语言的规则,它被称为架构。这些规则不会包括语法细节(那是 xml 标准所要规定的),架构文档需要定义的是符合你的数据类型的逻辑规则,它包括以下几项:
- 文档词汇。它定义了哪些元素或特性的名字可以出现在你的 xml 文档中。
- 文档结构。它定义了标签放在哪儿,可以指定标签之间的顺序,还可以指定某个元素可以出现的次数。
- 支持的数据类型。可以定义数据是文本,或者必须是可以解析的数值数据、日期信息等。
- 允许的数据范围。可将数值限制在范围内,文本限定在特定长度内,强迫正则表达式模式匹配,或者限制仅可以是某些特定的值。
下面的这个 xml 架构定义了前面所示的产品类别规则:
<?xml version="1.0" encoding="utf-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/xmlschema"> <xsd:element name="productcatalog"> <xsd:complextype> <xsd:sequence> <xsd:element name="catalogname" type="xsd:string" /> <xsd:element name="expirydate" type="xsd:date" /> <xsd:element name="products"> <xsd:complextype> <xsd:sequence> <xsd:element name="product" type="producttype" maxoccurs="unbounded" /> </xsd:sequence> </xsd:complextype> </xsd:element> </xsd:sequence> </xsd:complextype> </xsd:element> <xsd:complextype name="producttype"> <xsd:sequence> <xsd:element name="productname" type="xsd:string" /> <xsd:element name="productprice" type="xsd:decimal" /> <xsd:element name ="instock" type="xsd:boolean" /> </xsd:sequence> <xsd:attribute name="id" type="xsd:integer" use="required" /> </xsd:complextype> </xsd:schema>
- 所有的架构文档都是以根元素 <schema> 开头的 xml 文档
- 所有可用的元素都已经在 xml 架构空间定义了(http://www.w3.org/2001/xmlschema)
- 你的架构文档必须使用正确的命名空间名(前缀一般是 xsd 或 xs ,你也可以自定义)
- 在 <schema> 元素内,有两种类型的定义
- <element> 定义目标文档必须遵循的结构
- <complextype> 定义文档结构较小的数据结构
- <element>标签是架构的核心,同时它也是所有验证的起点
在这个示例中,<element>标签确定产品类别必须以一个叫做<productcatalog>的根元素开始。<productcatalog>元素内部是一个由3个元素组成的序列。第一个是<catalogname>,它包含普通文本;第二个是<expirydate>,它包含符合日期呈现规则的文本;第三个是<products>,它包含<product>元素的列表。
每个<product>元素都是一个复杂的类型,因此文档后面又使用<complextype>进行了定义。这个复杂类型(名为<producttype>)由含有产品信息的 3 个元素所组成的序列构成。这些元素分别保存文本(<productname>)、十进制数(<productprice>)、布尔值(<instock>)。这个复杂类型还包括一个必须的特性 id。