我想编组和解组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. XML架构验证(XSD)
- 2. Spyne:Spyne:XML/XSD架构验证
- 3. 使用XSD验证XSD架构
- 4. 如何在针对XSD验证XML时解决“找不到架构...”错误?
- 5. 使用XSD架构进行Xml验证
- 6. 不同的验证对XSD
- 7. 如何为XSD架构验证XQuery源文件
- 8. 在Java中验证时从XML获取架构信息
- 9. 如何从类创建XSD架构?
- 10. 获取异常java.lang.NoClassDefFoundError同时使用JSON-架构验证-2.2.6
- 11. XSD验证错误,同时使用
- 12. 根据Java中的XSD验证XML /获取模式位置
- 13. 如何读取属性从不同的位置,文件中JAVA
- 14. 无法验证针对多个XSD架构在C#
- 15. 如何在servlet上下文中从jar文件中读取xml架构
- 16. Laravel 5.1 Eloquent - 引用来自验证的不同架构说架构不存在
- 17. noClassdeffounderror从外部jar运行代码时从不同的位置
- 18. 从jar或类路径中的任何位置读取文件?
- 19. 重构XSD架构
- 20. 架构验证android
- 21. 如何在php中使用XSD架构
- 22. 验证XML在运行时加载架构,失败取决于架构顺序
- 23. XSD的架构?
- 24. 使用JavaScript进行RelaxNG或XSD架构验证
- 25. C#XMLReader - 多个子集合失败通过XSD架构验证
- 26. 为消息验证创建XSD架构问题
- 27. 写一个XSD架构验证为有效
- 28. java.net.MalformedURLException:无协议,而验证XML字符串XSD架构
- 29. 如何在xsd里面验证xml?
- 30. XSD验证错误人类可读
“我试图通过使用JAXB验证它,但它失败” - 它以哪种方式失败,您能提供任何相关的代码片段或错误消息吗? – gareththegeek