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