2017-10-12 184 views
0

我想編組和解組xsd。我有一個罐子說A.jar包含一個xsd文件說1.xsd。我試圖通過使用JAXB來驗證它,但它失敗了。 1.xsd正在導入另外3個存在於不同jar(B. jar)中的模式。我怎樣才能驗證它,同時驗證它1.xsd可以讀取屬於不同jar(B.jar)的導入文件。如何在驗證時從不同位置(Jar)讀取XSD架構

+0

「我試圖通過使用JAXB驗證它,但它失敗」 - 它以哪種方式失敗,您能提供任何相關的代碼片段或錯誤消息嗎? – gareththegeek

回答

0

假設這兩個jar都可以在類路徑中使用,模式文件是否分佈在不同的jar中並不重要。如果一個模式導入或包含另一個模式,重要的是該路徑可以被解決。

假設您有一個包my.project.schemas,它存在於A.jarB.jar中。在A.jar該軟件包中包含1.xsd,該文件在B.jar的相同包中導入2.xsd。如果1.xsd進口元素看起來像這樣...

<xs:import namespace="https://www.example.com" schemaLocation="2.xsd" /> 

那麼它應該工作。解析器負責定位其他模式,並且由於給定schemaLocation是相對的,因此解析器會查找它,因爲它將不同jar文件中的相同包視爲相同的位置。

如果有不同的軟件包,事情會變得更加複雜。在這種情況下,您需要使用相對路徑,可能需要在包層次結構中上下移動以引用正確的文件(例如:如果包additional是包my.project.schemas的成員,則爲additional/2.xsd)。另一種選擇是use a custom resolver。這使您可以攔截對外部資源的調用並以編程方式解決它們。

最後,請注意SchemaFactory用於創建Schema對象has a method that accepts an array of sources。如果您爲每個模式文件創建一個Source並將其全部提供給工廠以創建一個Schema對象,則可以避免位置問題。實際上,您可以省略schemaLocation屬性,因爲可以在所有提供的模式中找到必要的引用。

在過去,我已經使用JAXB驗證marshallers/unmarshallers,它們必須跨不同的包使用模式導入對方,這也可以跨越不同的jar。最後的解決方案是爲工廠方法提供每架構Source,這是我首選的方法。