gpt4 book ai didi

java - 当 XSD 驻留在 JAR 中时,如何将包含另一个 XSD 的 XSD 与 JAXB 一起使用?

转载 作者:行者123 更新时间:2023-11-30 08:46:21 26 4
gpt4 key购买 nike

我正在将通过 XSD 文件验证的 XML 文件读取到 XJC 生成的类中。当我在普通文件系统中引用 XSD 时,一切正常。现在我想将 XSD 捆绑到我的 JAR 中。只要 XSD 独立于以下代码,这也可以正常工作:

//Use the schema factory to get the schema
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

//Get XSD from JAR
InputStream schemaStream = getClass().getResourceAsStream("/schema/myschema.xsd");
Schema schema = sf.newSchema(new StreamSource(schemaStream));

//parse the XML file and fill the data model
Class<T> c = getXmlDataModelClass();
JAXBContext jaxbContext = JAXBContext.newInstance(c);

m_JaxbUnmarshaller = jaxbContext.createUnmarshaller();

//set the schema to be considered
m_JaxbUnmarshaller.setSchema(schema);

return (T)m_JaxbUnmarshaller.unmarshal(file);

现在的问题是:如果 myschema.xsd 包含另一个 XSD:

<xs:include schemaLocation="BaseTypes.xsd"/>

找不到包含的 XSD 中的类型。

我还尝试将两个带有两个 XSD 的 StreamSource 的数组传递给 sf.newSchema(),但这没有帮助。

最佳答案

最简单的是使用 URL,例如(未测试):

URL schemaURL = getClass().getResource("/schema/myschema.xsd");
Schema schema = sf.newSchema(schemaURL);

您将获得一个 jar:... URL 并将其提供给模式工厂。只要包含的模式位于同一个 JAR 中,就应该可以毫无问题地解决它们。

对于更高级的用法,您可以实例化并向模式工厂提供资源解析器:

sf.setResourceResolver(myResourceResolver);

资源解析器将模式解析为资源。例如,您可以使用 XMLCatalogResolver 之类的东西来使用目录文件重写架构 URL。这将允许您将绝对 URL 重写为本地资源。

关于java - 当 XSD 驻留在 JAR 中时,如何将包含另一个 XSD 的 XSD 与 JAXB 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32905581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com