简体   繁体   中英

Generating big enum classes with numbers in enum values JAXB, XJC

I'm trying to generate java classes using XJC and I have the following problem:

I'm trying to parse this schema which is a big enum type (bigger than default typesafeEnumMaxMembers ). So I use following binding:

<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>

and then I call xjc with following line:

C:\Program Files\Java\jdk1.7.0_17\bin\xjc.exe -d C:\Users\buriak\out xml\dAllDocuments_v02.1.xsd xml/binding.xjb

this gives no errors, just that:

parsing a schema...
compiling a schema...

Then it ends without creating anything.

Smaller enum types are easily parsed same way, but bigger once are just ignored and if they are a part of some other type other xsd - they simply become a string:

<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;
...............

Using JAXB or XmlBeans results with nothing aswell.

Hope somebody knows what to do with that.

EDIT After browsing without finding answers for long time I started to think, that it is not the size that is the problem. I was right and as a result I found this - JAXB enumeration with numeric values

But XSD which I'm trying to parse is very big:

<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"/>....

And it keeps going for long more. There is absolutely no way I can write them all down in such a way:

<jxb:bindings node="//xs:simpleType[@name='dAllDocuments']/xs:restriction/xs:enumeration[@value='008001000000']">
            <jxb:typesafeEnumMember name="OOBOOIOOOOOO"/>
        </jxb:bindings>

Is there any way to make this work other than specifying name for each value manually? I mean I can create a program which will make that kind of stuff using Strings, but is there any smart way? Because actual XSD that I'm parsing is connected to multiple of such ENUM XSD and I need to parse them all.

After spending some more time on research I finally managed to get results which I was waiting for from xjc.

Here is binding file I was using, so that I don't get warning for enum type being too big and so that all those big enum types would have a generated name like VALUE_1, VALUE_2 etc.

<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>

Also I'd like to mention that, since XSD files, which I was parsing, had a lot of cyrillic letters, here is xjc call I was using:

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

That makes almost every cyrillic letter enterance show in java files correctly.

That's it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM