我想編組和解組xsd。我有一個罐子說A.jar包含一個xsd文件說1.xsd。我試圖通過使用JAXB來驗證它,但它失敗了。 1.xsd正在導入另外3個存在於不同jar(B. jar)中的模式。我怎樣才能驗證它,同時驗證它1.xsd可以讀取屬於不同jar(B.jar)的導入文件。如何在驗證時從不同位置(Jar)讀取XSD架構
0
A
回答
0
假設這兩個jar都可以在類路徑中使用,模式文件是否分佈在不同的jar中並不重要。如果一個模式導入或包含另一個模式,重要的是該路徑可以被解決。
假設您有一個包my.project.schemas
,它存在於A.jar
和B.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
,這是我首選的方法。
相關問題
- 1. XSD架構驗證
- 2. XML架構驗證(XSD)
- 3. Spyne:Spyne:XML/XSD架構驗證
- 4. 使用XSD驗證XSD架構
- 5. 讀取XML在Java(Android版)XSD架構
- 6. 如何在針對XSD驗證XML時解決「找不到架構...」錯誤?
- 7. Jaxb2Marshaller XSD架構驗證查詢
- 8. 使用ISO-8859-1驗證XSD架構
- 9. 使用XSD架構進行Xml驗證
- 10. 不同的驗證對XSD
- 11. 從資源位置讀取jar文件
- 12. 如何在XSD的架構
- 13. 如何爲XSD架構驗證XQuery源文件
- 14. 如何使用xsd驗證器爲內部文本xml架構?
- 15. 如何讀取xml片段並驗證架構
- 16. 在Java中驗證時從XML獲取架構信息
- 17. 如何從類創建XSD架構?
- 18. 在XSD架構,如何不同類型的IDREF的
- 19. 使用XSD架構文件驗證XML文件。 (XML結構)
- 20. 獲取異常java.lang.NoClassDefFoundError同時使用JSON-架構驗證-2.2.6
- 21. XSD驗證錯誤,同時使用
- 22. 如何驗證指定位置的XSD字符串
- 23. 根據Java中的XSD驗證XML /獲取模式位置
- 24. 無法驗證針對多個XSD架構在C#
- 25. 無效的XSD架構在DOM文檔驗證
- 26. 如何讀取屬性從不同的位置,文件中JAVA
- 27. 如何在servlet上下文中從jar文件中讀取xml架構
- 28. 如何在不同位置顯示驗證錯誤信息?
- 29. 在XSLT(架構感知XSLT 2.0 ala後架構驗證Infoset)期間從XSD複製VALUE的任何方式)?
- 30. Laravel 5.1 Eloquent - 引用來自驗證的不同架構說架構不存在
「我試圖通過使用JAXB驗證它,但它失敗」 - 它以哪種方式失敗,您能提供任何相關的代碼片段或錯誤消息嗎? – gareththegeek