枚举与架构不匹配:jaxb 或 xsd 存在问题?
我正在尝试使用 JAXB 解组此文件转换为 Java 对象。我知道 J6 中的 SAX 存在拒绝 maxOccurs 行的问题,我已将其更改为 unbounded
。然而,当我xjc
它时,它并没有创建所有的类和类。我需要的枚举。例如,应该有一个 educationLevelType
枚举。更重要的是,我尝试过 MS 的 xsd unmarshaller,它可以正确创建所有内容。
有比我更有经验的人可以看看这个并告诉我我错过了什么吗? xsd 中是否有需要更正的内容,或者 JAXB 中是否存在错误?
更新 Blaise完全回答了这个问题。不幸的是,恕我直言,这使得 JAXB 毫无价值。整个想法是我可以从模式生成类 - 我不必事先了解有关结构的信息。如果我必须创建一个自定义绑定文件,我不妨创建一个生成我想要的代码的模式。但是,为什么要停在那里呢?为什么不跳过所有这些步骤并生成我想要的类呢?
最后,一位同事向我推荐了 Apache XMLBeans - 该项目有点旧,但它创建的对象没有麻烦。 Codehaus 还有一个 xmlbeans-maven-plugin 。
I'm trying to use JAXB to unmarshal this file into Java objects. I know that there's a problem with SAX in J6 that rejects the maxOccurs line, and I've changed it to unbounded
. However, when I xjc
it, it's not creating all the classes & enums I need. For example, there should be a educationLevelType
enum. What's more, I'ved tried MS's xsd unmarshaller, it it creates everything correctly.
Can someone with more experience than I look at this and tell me what I'm missing? Is there something that needs to be corrected in the xsd, or is there a bug in JAXB?
Update
Blaise completely answered this question as asked. Unfortunately, IMHO, this makes JAXB worthless. The whole idea is that I can generate classes from a schema - I shouldn't have to know stuff about the structure beforehand. If I have to create a custom bindings file, I might as well just create a schema that produces the code I want. But then, why stop there? Why not just skip all those steps and generate the classes I want?
In the end, a coworker pointed me to Apache XMLBeans - the project's a little older, but it creates the objects without trouble. Codehaus also has a xmlbeans-maven-plugin for it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
有几个枚举值导致了此问题。这些问题可以通过使用 JAXB 外部绑定文件来解决(见下文)。
枚举问题 #1 - 空字符串
某些枚举值是空字符串 (""),这会导致生成字符串而不是枚举属性:
枚举问题 #2 - 数字String
一些枚举值是数字,这会导致生成 String 而不是枚举属性:
绑定文件 (bindings.xml)
以下绑定文件可用于解决educationLevelType 的问题,这里的概念可以应用于所有有问题的类型:
XJC 调用可以如下进行(-nv 标志如下所述):
这将导致以下枚举生成:
maxOccurs 问题
对于 maxOccurs 问题,可以使用以下带有无验证 (-nv) 标志的命令行来解析 XML 模式:
这将使您过去无需修改 XML 架构即可出现以下错误:
了解更多信息
There are a couple of enumeration values that are causing this issue. These issues can be overcome through the use of a JAXB external binding file (see below).
Enum Issue #1 - Empty String
Some of your enum values are empty string (""), which is causing a String rather than an enum property to be generated:
Enum Issue #2 - Numeric String
Some of the enum values are numbers which is causing a String rather than an enum property to be generated:
Bindings File (bindings.xml)
The following bindings file can be used to address the issues with the educationLevelType, the concepts here can be applied to all the problematic types:
The XJC call can be made as follows (the -nv flag is described below):
This will cause the following Enum to be generated:
maxOccurs Issue
For the maxOccurs issue, the following command line with the no verify (-nv) flag can be used to parse the XML schema:
This will get you past the following error without having to modify the XML schema:
For More Information
您还可以使用 typesafeEnumMemberName="generateName" 的 globalBindings,而不是为每个枚举值指定绑定,
请参阅 http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html# wp148515
Instead of specifying a binding for each enum value, you can also use a globalBindings with typesafeEnumMemberName="generateName"
see http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html#wp148515
XMLBeans 也不为此 XML 模式生成枚举。使用 XMLBeans 2.5.0(来自 http://xmlbeans.apache.org/ 的最新版本),以下是为 educationLevelType 生成:
XMLBeans does not generate an enum for this XML schema either. Using XMLBeans 2.5.0 (the latest from http://xmlbeans.apache.org/) the following is what is generated for educationLevelType: