我试图使用XJC生成java类,我遇到了以下问题:
我试图解析this schema这是一个很大的枚举类型(大于默认typesafeEnumMaxMembers
)。所以我使用以下绑定:
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<!-- Raise theEnumMemberSizeCap limit -->
<jxb:bindings >
<jxb:globalBindings typesafeEnumMaxMembers="2000"/>
</jxb:bindings>
</jxb:bindings>
然后我用以下行调用xjc:
C:\Program Files\Java\jdk1.7.0_17\bin\xjc.exe -d C:\Users\buriak\out xml\dAllDocuments_v02.1.xsd xml/binding.xjb
这没有错误,只是:
parsing a schema...
compiling a schema...
然后结束而不创造任何东西。
较小的枚举类型很容易以相同的方式解析,但更大的一次只会被忽略,如果它们是其他类型的其他类型的其他xsd的一部分 - 它们只是变成一个字符串:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:include schemaLocation="dAllDocuments_v02.1.xsd"/>
<xs:complexType name="tDocument">
<xs:annotation>
<xs:documentation>Документ - описание</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="Code_Document" type="dAllDocuments">
<xs:annotation>
<xs:documentation>Код документа</xs:documentation>
</xs:annotation>
</xs:element>
...............
public class TDocument {
@XmlElement(name = "Code_Document", required = true)
protected String codeDocument;
...............
使用JAXB或XmlBeans结果时也没有。
希望有人知道如何处理。
修改 在很长一段时间没有找到答案的情况下浏览后,我开始思考,这不是问题的大小。 我是对的,结果我找到了这个 - JAXB enumeration with numeric values
但是我试图解析的XSD非常大:
<xs:simpleType name="dAllDocuments">
<xs:restriction base="xs:string">
<xs:enumeration value="008001000000"/>
<xs:enumeration value="008001001000"/>
<xs:enumeration value="008001002000"/>
<xs:enumeration value="008001003000"/>
<xs:enumeration value="008001004000"/>
<xs:enumeration value="008001005000"/>
<xs:enumeration value="008001006000"/>
<xs:enumeration value="008001007000"/>
<xs:enumeration value="008001008000"/>
<xs:enumeration value="008001009000"/>
<xs:enumeration value="008001010000"/>....
它会持续多久。我绝对不可能以这种方式写下所有内容:
<jxb:bindings node="//xs:simpleType[@name='dAllDocuments']/xs:restriction/xs:enumeration[@value='008001000000']">
<jxb:typesafeEnumMember name="OOBOOIOOOOOO"/>
</jxb:bindings>
除了手动指定每个值的名称之外,还有什么方法可以完成这项工作吗? 我的意思是我可以创建一个程序,使用字符串来制作那种东西,但是有什么聪明的方法吗? 因为我正在解析的实际XSD连接到多个这样的ENUM XSD,我需要解析所有这些。
答案 0 :(得分:2)
在研究上花了一些时间之后,我终于设法得到了我在等待xjc的结果。
这是我正在使用的绑定文件,因此我没有收到关于枚举类型太大的警告,以至于所有这些大枚举类型都会生成如VALUE_1, VALUE_2
等生成的名称。
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<!-- Raise theEnumMemberSizeCap limit -->
<jxb:bindings >
<jxb:globalBindings typesafeEnumMaxMembers="2000" typesafeEnumMemberName="generateName"/>
</jxb:bindings>
<jxb:bindings schemaLocation="STD_Region_Cadastr.xsd">
<jxb:bindings node="//xs:complexType[@name='tRight_Owner']">
<jxb:class name="tRight_Owner2"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
另外我想提一下,因为我正在解析的XSD文件有很多西里尔字母,所以这里是我正在使用的xjc调用:
C:\Program Files\Java\jdk1.7.0_17\bin>xjc.exe -b xml/binding.xjb -d C:\Users\buriak\out xml\STD_Region_Cadastr.xsd -encoding UTF-8
这使得几乎所有的西里尔字母enterance都能正确显示在java文件中。
就是这样。