我正在尝试使用EclipseLink MOXy 2.6针对多个XML模式解析XML文件 - common.xsd
和userOfCommon.xsd
。
userOfCommon.xsd
包含common.xsd
并使用其中定义的某些类型。
我想验证你必须像这样设置unmarshaller:
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source common = new StreamSource(this.getClass().getResourceAsStream("xsd/common.xsd"));
Source userOfCommon = new StreamSource(this.getClass().getResourceAsStream("xsd/userOfCommon.xsd"));
Schema schema = sf.newSchema(new Source[] {common, userOfCommon});
unmarshaller.setSchema(sf.newSchema(schema));
但是设置架构会出现错误,指出“未能将'某些复杂类型名称'解析为(n)'类型定义'组件。”
我尝试将架构设置为像这样的文件名
Schema schema = sf.newSchema(new File("xsd/userOfCommon.xsd"));
它有效。但是我想将模式设置为Source项,以便从类路径加载它。
有任何建议如何实现这一目标?
答案 0 :(得分:0)
实际上这里给出的答案https://stackoverflow.com/a/1105871/4243908适用于这种情况。
我必须在SchemaFactory中设置一个自定义的ResourceResolver,就像这样
sf.setResourceResolver(new ResourceResolver());
ResourceResolver的代码可用here
在这种情况下,无需导入多个架构源。您可以像这样导入主模式源:
Schema schema = sf.newSchema(userOfCommon);
但是我仍然没有想出如何使用多个架构源实现它并且不使用自定义ResourceResolver。
答案 1 :(得分:0)
尝试在创建StreamSource
时使用位置,如下所示:
Source common = new StreamSource(this.getClass().getResource("xsd/common.xsd").toString());
Source userOfCommon = new StreamSource(this.getClass().getResource("xsd/userOfCommon.xsd").toString());
该位置用于相对解析模式导入