正确加载包装在WAR中的XSD的方法?

时间:2011-03-15 03:44:14

标签: java-ee xsd jaxb

我正在尝试验证在Web应用程序中解组的XML文件。 xml文件本身位于Web应用程序部署目录之外,相应的XSD打包在WAR,类路径中的WEB-INF / classes / com / moi

我一直无法弄清楚如何创建Schema对象,以便它相对于类路径获取XSD文件,而不是相对于工作目录硬编码路径。我想相对于类路径选择它,所以我可以在部署应用程序时(以及从单元测试运行时)找到它。下面的示例代码可以查找相对于工作目录的内容。

JAXBContext context;
context = JAXBContext.newInstance(Foo.class);
Unmarshaller unMarshaller = context.createUnmarshaller();

SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File("src/com/moi/foo.xsd"));

unMarshaller.setSchema(schema);
Object xmlObject = Foo.class.cast(unMarshaller.unmarshal(new File("C:\\foo.xml")));
return (Foo) xmlObject;

环境正在使用JAXB2 / JDK 1.6.0_22 / JavaEE6。想法?

2 个答案:

答案 0 :(得分:8)

您可以执行以下操作:

ClassLoader classLoader = Foo.class.getClassLoader();
InputStream xsdStream = classLoader.getResourceAsStream("com/moi/foo.xsd");
StreamSource xsdSource = new StreamSource(xsdStream);
Schema schema = sf.newSchema(xsdSource);

答案 1 :(得分:0)

如果我们有多个XSD,它们在内部使用import。那么这不起作用。它只加载一个文件,因此无法加载其他导入的xsd架构。

这个答案很好。 https://stackoverflow.com/a/9280611/4498746