使用Moxy解组多个XML模式的xml文件

时间:2015-07-28 12:56:06

标签: java xml validation unmarshalling moxy

我正在尝试使用EclipseLink MOXy 2.6针对多个XML模式解析XML文件 - common.xsduserOfCommon.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项,以便从类路径加载它。

有任何建议如何实现这一目标?

2 个答案:

答案 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());

该位置用于相对解析模式导入