我应该在哪里放置XSD文件以用于JAXB代码生成和XML验证

约翰斯

我在Java项目中创建了一个XSD文件,该文件定义了一个用户可编辑的输入文件(为说明起见,假设XSD名为userinput.xsd,而用户可编辑的文件为userinput.xml)。程序运行时,它使用JAXB来验证用户在XML文件中没有犯任何错误,因为该程序将文件解组为DOM。

我使用Maven标准目录布局结构化了我的项目,并使用xjc生成了JAXB对象工厂和其他类,并将它们放置在名为/ src / main / java / my / name / space / generated / userinput的目录中(以匹配名称) XSD)。

我已经将XSD文件放在/ src / main / resources中。

当打包jar文件时,该文件位于jar的根目录中,并且可以在Java代码中按如下方式引用它(特别注意第4行中提到的资源):

JAXBContext jaxbContext = JAXBContext.newInstance("my.name.space.generated.userinput");
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(getClass().getResource("/userinput.xsd"));
unmarshaller.setSchema(schema);
JAXBElement<?> userinputType = (JAXBElement<?>) unmarshaller.unmarshal(new FileInputStream("userinput.xml"));

这行得通,但似乎并不正确,因为这意味着如果我想扩展到多个输入文件,则可能在源代码管理的资源目录和jar文件的根目录中都包含许多.xsd文件。

另外,当我从IDE而不是从打包的jar运行程序时,我必须将第四条语句更改为:

Schema schema = schemaFactory.newSchema(getClass().getResource("src/main/resources/userinput.xsd"));

我应该将XSD文件(a)放在源代码控制(即Maven结构)中,以及(b)放在jar文件中的什么位置?[注意:通过我的IDE运行xjc会将它放在... / generation / userinput目录中,但是Maven在打包时会忽略它。

我正在寻找一个表明存在某种通用方法的答案,因此,在可能的情况下希望提供参考。如果当前这是开发人员的未指定选择,请说出(最好是引用),因为我知道stackoverflow并不是收集意见的地方。

Lexicore

的默认布局是将架构放入中src/main/resources这样,您的架构schema.xsd就可以作为资源使用getClass().getResource("/schema.xsd")
有些人使用src/main/schemassrc/main/xsd但是,如果要将模式用作资源,最好使用默认值。

我不明白为什么这“看起来不正确”。到底是什么问题?版本控制中有很多文件?JAR中有很多文件?为什么会有问题呢?

如果要结构化和模块化,请在自己的Maven模块中分别编译模式。我通常更喜欢每个规范/版本一个模块(例如,参见ogc-schemas项目。

如果需要getClass().getResource("src/main/resources/userinput.xsd")在IDE中进行操作,则表明您在IDE中的项目配置错误。应该将资源复制/视为类路径的一部分,以便/userinput.xsd可以正常工作。这并不意味着src/main/resources位置错误,这意味着您的项目配置不正确。

如果您使用的是Maven,请不要依赖IDE进行代码生成。代码生成是构建过程的一部分。使用Maven插件进行模式编译。

免责声明:我是的作者,也是上述OGC Schemas项目的作者。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章