将大型模式编译为Java

时间:2011-04-15 21:35:13

标签: java xml xsd

有两种主要工具可以提供将XSD模式编译为Java的方法:xmlbeans和JAXB。

问题是XSD架构非常庞大:30MB的XML文件,我的项目中没有使用大部分架构,所以我可以注释掉大部分代码,但这不是一个好的解决方案。

目前我的项目使用xmlbeans,它会对主要更改的模式进行编译。它产生大约60MB的类,编译需要大约30分钟。

另一种解决方案是使用JAXB,它可以生成~14MB的代码而无需编辑代码。但是它产生了巨大的ObjectFactory类,它无法使用“太多常量”错误进行编译。我可以抛弃类并在没有它的情况下编译模式,但据我所知,它是非常有用的类。

任何想法如何处理这个庞大的架构?

2 个答案:

答案 0 :(得分:3)

您是否可以创建一个脚本来提取所需模式的部分,并在使用XmlBeans或JAXB进行映射之前将其集成到构建过程中?

你可以在Python,Perl,Awk等中简单易用地编写这个提取脚本;或者甚至在XSL中,如果你有专业知识(我从来没有花足够的时间编写XSL以获得熟练,所以我可能会坚持使用脚本语言,但那只是我)。

e.g:

python extract.py big-schema.xsd >small-schema.xsd
xsd2java <args> small-schema.xsd
...

您可能会发现第三方供应商的后续更新会使您的提取脚本无效,但除非他们对整个架构进行了非常大的更改,否则您应该能够非常快速地更新脚本,并且它会发出声音像这些更新应该是相当罕见的。

顺便说一句,我对XmlBeans有点偏爱;当我们对XML-Java映射工具进行自己的评估时,它似乎比我们尝试的其他任何东西都更好地处理像xs:choice,xs:all和type-substitution这样的构造。但那是几年前的事了,现在肯定已经改变了。在这一点上,我们继续更多地使用它来摆脱制度惯性而不是其他任何东西,所以请谨慎使用这个建议。

答案 1 :(得分:1)

30Mb架构?究竟是什么 - 我有兴趣知道它是否可用作架构处理器的测试用例。

数据映射(la JAXB)最适用于小型模式。我看到当架构变得大约200个元素类型时,人们真的很挣扎。你必须在这里处理几个数量级的东西 - 我会说它不是首发。