2010-11-04 47 views
1

我有一個使用舊版本XML規範(http://www.w3.org/1999/XMLSchema)構建的XML模式。我正試圖使用​​模式解析XML消息(如下所示)。默認情況下,Xerces 1.1解析器將在應用程序域根目錄中查找模式。我正在嘗試將架構移動到我們的Web目錄中的公共位置。看起來我無法在使用Xerces 1.1庫的解析程序中指定URL作爲架構位置。如何使用舊的(1999)模式版本解析/驗證JAXP中的XML?

所以我試圖升級我的程序來使用JAXP DocumentBuilderFactory和它的setSchema()方法。這似乎找到了我提供它的模式URL的模式,除了它提供瞭解析錯誤,因爲模式(大概)不符合規範的更高版本(例如,我得到錯誤,因爲我的Ticket元素沒有將其成員包裝在xs:Sequence中)。

我無法升級我的模式,因爲目前我無法強迫外部客戶重寫他們向我們發送消息的應用程序。

任何人都可以告訴我如何使用JAXP成功地解析/驗證使用架構規範的老派版本嗎?或者,有沒有辦法告訴Xerces 1.1 DOMParser使用由URL定義的模式(不是文件位置)?

這裏是什麼樣的架構看起來像一個示例:

<?xml version="1.0" encoding="UTF-8" ?> 
<schema> 
    <element name="Ticket"> 
    <complexType> 
     <element ref="ID" /> 
     <element ref="User" /> 
    </complexType> 
    </element> 

    <element name="ID" type='string' /> 
    <element name="UserID" type='string' /> 
</schema> 

XML文檔看起來是這樣的:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<Ticket xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation='TicketSubmission.xsd'> 
    <ID>2010:December2:Dec:12:05:33:245</ID> 
    <UserID>user123</UserID> 
</Ticket> 

謝謝!

回答

0

所以,我得出結論,使用1999架構規範是一個壞主意。支持1999架構規範的早期版本的Xerces解析器在架構可以駐留在磁盤上的位置似乎並不靈活。我可能堅持將模式放在應用服務器根目錄中,直到我們可以讓我們的客戶端使用我們的模式的新版本。

Xerces的更新版本(甚至在Xerces 2之前)似乎放棄了對1999架構規範的支持,轉而支持2001架構規範。儘管更高版本的Xerces看起來好像在模式文件的位置允許更多的靈活性。

+0

我又看了一遍,發現可以創建一個自定義的EntityResolver並將其設置在解析器上。覆蓋resolveEntity方法允許您返回一個InputSource,其中systemId指向一個URL或一個包含您要使用的模式的文件。 – gangsta 2010-11-17 20:54:00

0

使用舊版本的JAXP;也許1.6

+0

感謝您的建議。我嘗試在1.x行中使用更新版本的Xerces(晚於1.1.1)。我沒有任何運氣。後來的版本似乎只支持2001架構版本,儘管它們可以更靈活地將您的架構放在磁盤上。 – gangsta 2010-11-08 03:42:18

相關問題