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.
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:
<xs:enumeration value="">
    <xs:annotation>
        <xs:documentation>Blank</xs:documentation> 
    </xs:annotation>
</xs:enumeration>
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:
<xs:enumeration value="6">
    <xs:annotation>
        <xs:documentation>6th grade</xs:documentation> 
   </xs:annotation>
</xs:enumeration>
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:
<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">
    <jxb:bindings schemaLocation="http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd">
        <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='6']">
            <jxb:typesafeEnumMember name="SIX"/>
        </jxb:bindings>
        <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='7']">
            <jxb:typesafeEnumMember name="SEVEN"/>
        </jxb:bindings>
        <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='8']">
            <jxb:typesafeEnumMember name="EIGHT"/>
        </jxb:bindings>
        <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='9']">
            <jxb:typesafeEnumMember name="NINE"/>
        </jxb:bindings>
        <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='10']">
            <jxb:typesafeEnumMember name="TEN"/>
        </jxb:bindings>
        <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='11']">
            <jxb:typesafeEnumMember name="ELEVEN"/>
        </jxb:bindings>
        <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='12']">
            <jxb:typesafeEnumMember name="TWELVE"/>
        </jxb:bindings>
        <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='']">
            <jxb:typesafeEnumMember name="BLANK"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>
The XJC call can be made as follows (the -nv flag is described below):
xjc -nv -b bindings.xml -d out http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd
This will cause the following Enum to be generated:
package gov.hhs.acf.nytd;
import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;
import javax.xml.bind.annotation.XmlType;
@XmlType(name = "educationLevelType")
@XmlEnum
public enum EducationLevelType {
    @XmlEnumValue("under 6")
    UNDER_6("under 6"),
    @XmlEnumValue("6")
    SIX("6"),
    @XmlEnumValue("7")
    SEVEN("7"),
    @XmlEnumValue("8")
    EIGHT("8"),
    @XmlEnumValue("9")
    NINE("9"),
    @XmlEnumValue("10")
    TEN("10"),
    @XmlEnumValue("11")
    ELEVEN("11"),
    @XmlEnumValue("12")
    TWELVE("12"),
    @XmlEnumValue("post secondary")
    POST_SECONDARY("post secondary"),
    @XmlEnumValue("college")
    COLLEGE("college"),
    @XmlEnumValue("")
    BLANK("");
    private final String value;
    EducationLevelType(String v) {
        value = v;
    }
    public String value() {
        return value;
    }
    public static EducationLevelType fromValue(String v) {
        for (EducationLevelType c: EducationLevelType.values()) {
            if (c.value.equals(v)) {
                return c;
            }
        }
        throw new IllegalArgumentException(v);
    }
}
maxOccurs Issue
For the maxOccurs issue, the following command line with the no verify (-nv) flag can be used to parse the XML schema:
xjc -nv -d out http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd
This will get you past the following error without having to modify the XML schema:
parsing a schema... [ERROR] Current configuration of the parser doesn't allow a maxOccurs attribute value to be set greater than the value 5,000.
line 41 of http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsdFailed to parse a schema.
For More Information
Instead of specifying a binding for each enum value, you can also use a globalBindings with typesafeEnumMemberName="generateName"
<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
                xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
                xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
                xsi:schemaLocation="
http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
    version="2.1" schemaLocation="xxxxxxxxx.xsd" >
    <schemaBindings>
        <package name="xx.xx.xx" />
    </schemaBindings>
    <globalBindings typesafeEnumMemberName="generateName"/>
</bindings>
see http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html#wp148515
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With