首页 > 焦点 > XMLBeans实例:地址簿
XMLBeans实例:地址簿
网上收集 2007/11/26 14:11:58 (150)

XMLBeans介绍

XML已经迅速成为网络上事务处理的通用语言(lingua franca)。它是Web服务概念的基础,并且被广泛地应用在电子文档的交换中。用于处理Java应用中XML的第一代工具,基于文档对象模型(DOM)、XML的简单API(SAX)及XML解析器,分别完成各自的任务。然而,第一代技术没有充分利用Java语言的灵活性和强大性。

BEA Systems最近推出了一项叫做XMLBeans的新技术,它为在Java中处理XML提供更自然的、更直观的、更有力的处理机制。XMLBeans的名字是由XML(这很明显)加上JavaBeans得出来的,因为XMLBeans借用了JavaBeans组件体系结构中流行的属性样式。

当XMLBeans的8.0版本在2003年发布后,它的使用将贯穿整个WebLogic平台。但是这项技术本身能够单独运行,并且BEA已经发布了一项Web服务,允许在你选择的XML模式中试验XMLBeans。你提交模式(.xsd)文件(或是包含多个相关模式的ZIP文件),然后Web服务返回一个JAR文件,这个JAR文件包含针对模式的XMLBeans类以及支持XMLBeans API。稍后,我将在本文中演示怎样使用这项服务。你可以在BEA dev2dev开发者站点的XMLBeans Technical Track中阅读XMLBeans Service。

我在文中给出的例子论证了XMLBeans的一个独特的特征:XMLBeans模式编译器专为你的模式生成的强类型模式类型系统API。XMLBeans也被用于无模式的方案操作中。为得到更多的关于XMLBeans性能的内容,请参见XMLBeans Overview Page。
什么是XML模式?

虽然XML模式可以用于创建内容任意的XML文档,但它更感兴趣的(而且必需)是定义特定类型的文档。例如,如果每个公司都能为购买订单定义它自己的电子文档格式,电子商业将不会走得很远。XML支持正式文档类型的定义,在这些类型的基础上可以验证其他任何特定的文档。
在XML还不成熟的时候,有人在文档类型定义(DTD)文件中定义了一个文档类型。在DTD文档中,你可以指定能够存在于实例文档中的元素类型,元素必须被安排好,对于数值元素来说,还必须有值的范围样的限制。但是DTD文档也有许多缺点,最大的缺点是DTD文档用一种离奇的语言而不是用XML语言本身来表达。

现在定义XML文档的方法是使用XML模式。XML模式的用途和DTD文档一样,只不过是它用XML语言表达的。这意味着你可以用标准的XML工具创建、编辑以及操纵XML模式。

XML模式规范(可以在http://www.w3.org/XML/Schema中找到)还定义了一列可以用模式表达的46种特定数据类型,其中包括字符串、整型、浮点型、日期等更多的类型。因此,XML模式可以利用丰富的类型系统来反映了现代编程语言中可用的新技术。

本文描述的例子使用了两种类型的XML文档:联系人(contact)和地址簿(address book)。其中地址簿可以包含联系人。

contactUsa.xsd模式

XML模式通常存放在扩展名为.xsd的文件中,这是由于XML模式定义(XML Schema Definition)的首字母缩写为xsd。下面是一个来自contactUsa.xsd(本文提到的所有文件在AddressBookApp.zip中都可以找到)文件的XML模式例子。这个模式为地址簿中的条目(联系人)定义了格式。为简单起见,这个模式中用到的邮政地址都是按照美国的习惯表示的。

 

 

< xs:schema targetNamespace="http://dearjohn/address-book"
xmlns:xs=http://www.w3.org/2001/XMLSchema
xmlns:address-book="http://dearjohn/address-book"
elementFormDefault="qualified">
< xs:element name="contact">
< xs:complexType>
< xs:sequence>
< xs:element name="family-name" type="xs:string"/>
< xs:element name="given-name" type="xs:string"/>
< xs:element ref="address-book:mailing-address" minOccurs="0"
maxOccurs="2"/>
< xs:element ref="address-book:phone-number" minOccurs="0"
maxOccurs="3"/>
< /xs:sequence>
< /xs:complexType>
< /xs:element>

< xs:element name="mailing-address">
< xs:complexType>
< xs:sequence>
< xs:element name="address-line-1" type="xs:string"/>
< xs:element name="address-line-2" type="xs:string"
minOccurs="0"/>
< xs:element name="city" type="xs:string"/>
< xs:element name="state" type="address-book:state"/>
< xs:element name="zipcode" type="address-book:zipcode"/>
< /xs:sequence>
< xs:attribute name="location" type="xs:string"/>
< /xs:complexType>
< /xs:element>

< xs:element name="phone-number">
< xs:complexType>
< xs:sequence>
< xs:element name="area-code"
type="address-book:area-code"/>
< xs:element name="local-phone-number"
type="address-book:local-phone-number"/>
< /xs:sequence>
< xs:attribute name="location" type="xs:string"/>
< /xs:complexType>
< /xs:element>

< xs:simpleType name="area-code">
< xs:restriction base="xs:string">
< xs:pattern value="[0-9]{3}"/>
< /xs:restriction>
< /xs:simpleType>

< xs:simpleType name="local-phone-number">
< xs:restriction base="xs:string">
< xs:pattern value="[0-9]{3}-[0-9]{4}"/>
< /xs:restriction>
< /xs:simpleType>

< xs:simpleType name="state">
< xs:restriction base="xs:NMTOKEN">
< xs:enumeration value="AL"/>
< xs:enumeration value="AK"/>
...
< xs:enumeration value="WI"/>
< xs:enumeration value="WY"/>
< /xs:restriction>
< /xs:simpleType>

< xs:simpleType name="zipcode">
< xs:restriction base="xs:string">
< xs:pattern value="[0-9]{5}(-[0-9]{4})?"/>
< /xs:restriction>
< /xs:simpleType>

< /xs:schema>

 

在XML方案中有两种基本类型的元素:简单类型和复杂类型。简单类型定义的元素有值但没有子元素,复杂类型定义的元素可以有子元素。在上面的模式中,< contact>被定义为一个复杂元素,该元素可以(在本模式中实际上必须)有子元素< family-name>和< given-name>,还可以有类型< mailing-address>和< phone-number>的子类型。

我不想在XML模式上用太多的篇幅,它是一个复杂的主题而且关于这个主题有许多好书可以利用。但是这里有一些关于定义在contactUsa.xsd中模式的声明,即使你不熟悉XML模式,它也有助于你理解。下面是这些声明:

 

contactUsa.xsd中定义的所有元素都在XML名字空间http://dearjohn/address-book中。targetNamespace声明定义了用于该模式(在schema-speak中叫做"全局"元素)中顶级元素的命名空间。


elementFormDefault="qualified"规范意味着本方案中的所有非全局性元素也在目标命名空间中(只要它们没有明确说明位于其他的命名空间)。在模式文件中指定elementFormDefault="qualified"几乎总是一个好主意:你一般不想让同一个模式中的全局性和非全局性元素处于不同的命名空间。


< contact>总是包括名称字段,并且可以包含最多两个< mailing-address>元素和最多三个< phone-number>元素,这是可选的。

< mailing-address>必须总是按照顺序包含< address-line-1>、< city>、< state>和< zipcode>子元素。< mailing-address>可以在子元素< address-line-1>后紧跟一个子元素< address-line-2>。

< mailing-address>和< ph

阅读(150) (责任编辑:城市网)
关于我们 - 联系我们 - 网站荣誉 - 广告服务 - 版权声明 - 网站地图
Copyright© 2007-2018 bj1.com.cn 首都热线 版权所有 QQ:165687462
中国·北京 粤ICP备14047004号-20