WebLogic Workshop 8.1中處理不帶命名空間模式

發表于:2007-06-22來源:作者:點擊數: 標簽:
摘要 將遺留應用程序或集成系統與BEA WebLogic Workshop集成在一起時,經常要用到XML和模式。然而,某些遺留系統在最初設計時并沒有包括處理XML命名空間的功能。 相反,這些遺留系統只接受不帶目標命名空間的無格式XML消息,而這可能導致在WebLogic Workshop

   

摘要

  將遺留應用程序或集成系統與BEA WebLogic Workshop集成在一起時,經常要用到XML和模式。然而,某些遺留系統在最初設計時并沒有包括處理XML命名空間的功能。

相反,這些遺留系統只接受不帶目標命名空間的無格式XML消息,而這可能導致在WebLogic Workshop中出現沖突。事實上,可以在多個模式中定義名稱相同的全局類型或元素。

   本文描述了如何通過WebLogic Workshop和XMLBeans簡單而有效地解決這個問題。本文假定您對XML模式和XMLBeans有一些基本了解。您可以下載本文中使用的示例。

簡介

  XMLBeans提供了一種處理XML的方法,即操作代表XML的Java類。這些類是使用XML適合的模式來創建的??梢允褂肵MLBeans來編譯一個或多個模式文件,從而生成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?,F在可以導入另一個模式:

<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>

  清單 4: Sample2.xml

   在WebLogic Workshop中,當把這兩個模式文件導入到一個模式項目中并生成XMLBeans類時,WebLogic Workshop將顯示編譯錯誤:

  

ERROR: error: Duplicate global type: customer ERROR: error: Duplicate global element: purchase-order

可以看到,編譯器提示說全局類型customer和全局元素purchase-order被多次定義。如果看看我們的模式,就會發現這并不值得驚奇。當模式不帶目標命名空間時,這類沖突就很可能會出現。下面將給出解決這個問題的辦法。

解決方案

  有很多可行的解決方案都可以解決這個問題,我將挑出其中三種進行討論。

解決方案1:添加目標命名空間

  為模式添加不同的目標命名空間就可以解決這個問題——我們也推薦使用這種方法。但是,在大部分時間里您都無法控制模式,所以我們需要另尋出路。

解決方案2:創建單獨的模式項目

  解決該問題的另一種方法是在WebLogic Workshop中創建兩個模式項目。在這個例子中,假設您在應用程序中創建了另一個Schema項目,并分別在模式項目1和模式項目2中編譯schema1.xsd和schema2.xsd,如圖1所示。

   在這種情況下,可以成功編譯模式。兩個項目都不會抱怨定義重復。然而,看看圖1中生成的類便知,Libraries文件夾包含兩個jar文件,SchemaP1.jar和SchemaP2.jar,這兩個文件是WebLogic Workshop編譯的結果。兩個jars文件中均定義了noNamespace.Customer和noNamespace.PurchaseOrderDocument類,如下圖所示:

WebLogic Workshop 8.1中處理不帶命名空間模式(圖一)

   圖1: 一個包含兩個模式項目的WebLogic Workshop應用程序

   應用程序中創建了名稱相同的Java類(XMLBeans),結果您無法選擇要在應用程序中使用的那一個。在這種情況下,還是存在前面出現過的沖突問題,但是這次遇到麻煩的是應用程序類加載器。

   您還會注意到,Java包名稱“noNamespace”并非開發人員友好的,應該根據您的編碼習慣對其進行修改。這也為實際的解決方案指明了方向——只要修改包名稱便可避免沖突。第三種解決方案中可以解決這些問題。

解決方案3:使用XMLBeans配置文件

  在Dev2Dev站點上,您可以讀一篇有關XMLBeans編譯器選項的優秀文章,即Hetal Shah編寫的配置 XMLBeans(中文)(Dev2Dev,2004年11月)。這篇文章中提到,運行XMLBeans編譯器時,您可以指定一個可選的配置文件,用于修改XMLBeans生成器的行為。這樣就可以解決名稱沖突和包名稱不友好的問題。

   您可以在模式“project1”中創建一個compiler1.xsdconfig文件,如圖2所示。您將看到一個錯誤:

   ERROR: compiler1.xsdconfig:0: Document D:\SP5\user_projects\domains\Dev2Dev\SchemaP1\compiler1.xsdconfig is not an xsd config file

   您可以忽略上面的錯誤,不會出現問題,因為所創建的文件目前是空的和無效的。您可以使用這個配置文件指定Java包的名稱,從而為定義中缺少目標命名空間的XML元素和類型生成XMLBeans。此處的技巧在于使用保留字“##local”,如下所示:

<xb:config xmlns:xb="http://www.bea.com/2002/09/xbean/config"> <xb:namespace uri="##local"> <xb:package>com.foo>/xb:package> </xb:namespace> </xb:config>

清單 5: compiler1.xsdconfig

   現在,如果打開Libraries文件夾,您將會看到模式“Project1”jar包含Java包com.foo中的類,而不是圖1中noNamespace中的類。顯然,您應該使用有效的Java包名稱,否則將產生錯誤。

WebLogic Workshop 8.1中處理不帶命名空間模式(圖二)

   圖 2: WebLogic Workshop項目中xsdconfig.xml和結果jars文件的位置

   現在,通過創建一個類似的compiler2.xsdconfig文件,您可以對Project2執行同樣的步驟。

結束語

  遺留XML應用程序有時會省略命名空間,而這可能會導致集成問題。本文說明了如何使用XMLBeans配置文件編譯模式,從而減輕這個問題帶來的困擾。通過這個XMLBeans配置文件,您可以控制如何為生成的類型選擇名稱。設計該配置文件的目的是把模式類型名稱映射為生成的Java類型名稱。當一些模式擁有相同的命名空間時,同樣的方法可以防止類似問題的出現。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97