摘要
将遗留应用程序或集成系统与BEA WebLogic Workshop集成在一起时,经常要用到XML和模式。然而,某些遗留系统在最初设计时并没有包括处理XML命名空间的功能。相反,这些遗留系统只接受不带目标命名空间的无格式XML消息,而这可能导致在WebLogic Workshop中出现冲突。事实上,可以在多个模式中定义名称相同的全局类型或元素。
本文描述了如何通过WebLogic Workshop和XMLBeans简单而有效地解决这个问题。本文假定您对XML模式和XMLBeans有一些基本了解。您可以下载本文中使用的示例。
简介
XMLBeans提供了一种处理XML的方法,即操作代表XML的Java类。这些类是使用XML适合的模式来创建的。可以使用XMLBeans来编译一个或多个模式文件,从而生成Java类型。
集成遗留解决方案时碰到的一个常见问题是,要与不同来源的多个模式打交道,而这些模式均未带有指定的目标命名空间。假如这些模式共享元素名称,WebLogic Workshop模式项目就无法成功编译生成的Java类型,而且还会出现诸如“Duplicate global type”或“Duplicate global element”这样的错误。下面举例说明这样一个场景。
场景实例
假设您使用WebLogic Workshop创建了一个新的应用程序。通常您会创建一个模式项目,导入您的模式,然后WebLogic Workshop将自动把这个模式编译为XMLBeans:
<xs:schema xmlns:po="http://openuri.org/easypo"
xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="purchase-order" type="customer"/>
<xs:complexType name="customer"> <xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
</xs:sequence> </xs:complexType></xs:schema>
清单 1: Schema1.xsd
Schema1没有目标命名空间,所得到的XML文档中带有元素名称name和address,如下所示:
<?xml version="1.0" encoding="UTF-8"?><purchase-order
xmlns:po="http://openuri.org/easypo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<name>John</name>
<address>123 North First St</address></purchase-order>
清单 2: Sample1.xml
假如您尝试从这个模式生成Java类型,它将被正确地编译为一个XMLBean。现在可以导入另一个模式:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:foo="http://openuri.org/clientdb"
elementFormDefault="qualified">
<xs:element name="client-record" type="customer"/>
<xs:complexType name="customer"> <xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="phone" type="xs:string"/>
</xs:sequence> </xs:complexType>
<xs:element name="purchase-order" type="customer"/></xs:schema>
清单 3: Schema2.xsd
Schema2 同样没有目标命名空间。下面的XML文档就是这个模式的一个实例,它带有元素名称name, address和 phone:
<?xml version="1.0" encoding="UTF-8"?><client-record
xmlns:foo="http://openuri.org/clientdb"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>Susan</name>
<address>6789 South Second St</address>
<phone>408-123-4567</phone></client-record>