5

JAXBを使用してこのファイルをJavaオブジェクトにアンマーシャリングしようとしています。J6のSAXにmaxOccurs行を拒否する問題があることを知っているので、これをに変更しましたunbounded。ただし、私がxjcそれを行うと、必要なすべてのクラスと列挙型が作成されるわけではありません。たとえば、educationLevelType列挙型が必要です。さらに、MSのxsd unmarshallerを試しましたが、すべてが正しく作成されます。

私よりも経験豊富な人がこれを見て、私が欠けているものを教えてもらえますか?xsdで修正する必要があるものはありますか、それともJAXBにバグがありますか?

Update Blaiseは、尋ねられたとおりにこの質問に完全に答えました。残念ながら、私見では、これによりJAXBは無価値になります。全体的な考え方は、スキーマからクラスを生成できるということです。構造について事前に知っておく必要はありません。カスタムバインディングファイルを作成する必要がある場合は、必要なコードを生成するスキーマを作成することもできます。しかし、なぜそこで止まるのですか?これらの手順をすべてスキップして、必要なクラスを生成してみませんか?

結局、同僚が私にApache XMLBeansを指摘しました。プロジェクトは少し古いですが、問題なくオブジェクトを作成できます。Codehausには、そのためのxmlbeans-maven-pluginもあります。

4

3 に答える 3

7

この問題の原因となっている列挙値がいくつかあります。これらの問題は、JAXB外部バインディングファイルを使用することで解決できます(以下を参照)。

列挙型の問題#1-空の文字列

一部の列挙値は空の文字列( "")であるため、列挙プロパティではなく文字列が生成されます。

<xs:enumeration value="">
    <xs:annotation>
        <xs:documentation>Blank</xs:documentation> 
    </xs:annotation>
</xs:enumeration>

列挙型問題#2-数値文字列

列挙値の一部は数値であり、列挙プロパティではなく文字列が生成されます。

<xs:enumeration value="6">
    <xs:annotation>
        <xs:documentation>6th grade</xs:documentation> 
   </xs:annotation>
</xs:enumeration>

バインディングファイル(bindings.xml)

次のバインディングファイルを使用して、 educationLevelTypeの問題に対処できます。ここでの概念は、問題のあるすべてのタイプに適用できます。

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

XJC呼び出しは、次のように行うことができます(-nvフラグについては以下で説明します)。

xjc -nv -b bindings.xml -d out http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd

これにより、次の列挙型が生成されます。

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の問題

maxOccursの問題の場合、no verify(-nv)フラグを指定した次のコマンドラインを使用してXMLスキーマを解析できます。

xjc -nv -d out http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd

これにより、XMLスキーマを変更せずに、次のエラーを回避できます。

スキーマを解析しています...[エラー]パーサーの現在の構成では、maxOccurs属性値を値5,000より大きく設定することはできません。http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd
の41行目

スキーマの解析に失敗しました。

詳細については

于 2011-01-28T16:47:33.973 に答える
5

各列挙値のバインディングを指定する代わりに、typesafeEnumMemberName="generateName"でglobalBindingsを使用することもできます。

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

http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html#wp148515を参照してください

于 2011-06-21T15:00:26.480 に答える
0

XMLBeansは、このXMLスキーマの列挙型も生成しません。XMLBeans 2.5.0(http://xmlbeans.apache.org/からの最新のもの)を使用すると、educationLevelTypeに対して生成されるものは次のとおりです。

/*
 * XML Type:  educationLevelType
 * Namespace: http://nytd.acf.hhs.gov
 * Java type: gov.hhs.acf.nytd.EducationLevelType
 *
 * Automatically generated - do not modify.
 */
package gov.hhs.acf.nytd;


/**
 * An XML educationLevelType(@http://nytd.acf.hhs.gov).
 *
 * This is an atomic type that is a restriction of gov.hhs.acf.nytd.EducationLevelType.
 */
public interface EducationLevelType extends org.apache.xmlbeans.XmlString
{
    public static final org.apache.xmlbeans.SchemaType type = (org.apache.xmlbeans.SchemaType)
        org.apache.xmlbeans.XmlBeans.typeSystemForClassLoader(EducationLevelType.class.getClassLoader(), "schemaorg_apache_xmlbeans.system.s1A8CC5216945B0856A28CEF895800DEB").resolveHandle("educationleveltypeb147type");

    org.apache.xmlbeans.StringEnumAbstractBase enumValue();
    void set(org.apache.xmlbeans.StringEnumAbstractBase e);

    static final Enum UNDER_6 = Enum.forString("under 6");
    static final Enum X_6 = Enum.forString("6");
    static final Enum X_7 = Enum.forString("7");
    static final Enum X_8 = Enum.forString("8");
    static final Enum X_9 = Enum.forString("9");
    static final Enum X_10 = Enum.forString("10");
    static final Enum X_11 = Enum.forString("11");
    static final Enum X_12 = Enum.forString("12");
    static final Enum POST_SECONDARY = Enum.forString("post secondary");
    static final Enum COLLEGE = Enum.forString("college");
    static final Enum X = Enum.forString("");

    static final int INT_UNDER_6 = Enum.INT_UNDER_6;
    static final int INT_X_6 = Enum.INT_X_6;
    static final int INT_X_7 = Enum.INT_X_7;
    static final int INT_X_8 = Enum.INT_X_8;
    static final int INT_X_9 = Enum.INT_X_9;
    static final int INT_X_10 = Enum.INT_X_10;
    static final int INT_X_11 = Enum.INT_X_11;
    static final int INT_X_12 = Enum.INT_X_12;
    static final int INT_POST_SECONDARY = Enum.INT_POST_SECONDARY;
    static final int INT_COLLEGE = Enum.INT_COLLEGE;
    static final int INT_X = Enum.INT_X;

    /**
     * Enumeration value class for gov.hhs.acf.nytd.EducationLevelType.
     * These enum values can be used as follows:
     * <pre>
     * enum.toString(); // returns the string value of the enum
     * enum.intValue(); // returns an int value, useful for switches
     * // e.g., case Enum.INT_UNDER_6
     * Enum.forString(s); // returns the enum value for a string
     * Enum.forInt(i); // returns the enum value for an int
     * </pre>
     * Enumeration objects are immutable singleton objects that
     * can be compared using == object equality. They have no
     * public constructor. See the constants defined within this
     * class for all the valid values.
     */
    static final class Enum extends org.apache.xmlbeans.StringEnumAbstractBase
    {
        /**
         * Returns the enum value for a string, or null if none.
         */
        public static Enum forString(java.lang.String s)
            { return (Enum)table.forString(s); }
        /**
         * Returns the enum value corresponding to an int, or null if none.
         */
        public static Enum forInt(int i)
            { return (Enum)table.forInt(i); }

        private Enum(java.lang.String s, int i)
            { super(s, i); }

        static final int INT_UNDER_6 = 1;
        static final int INT_X_6 = 2;
        static final int INT_X_7 = 3;
        static final int INT_X_8 = 4;
        static final int INT_X_9 = 5;
        static final int INT_X_10 = 6;
        static final int INT_X_11 = 7;
        static final int INT_X_12 = 8;
        static final int INT_POST_SECONDARY = 9;
        static final int INT_COLLEGE = 10;
        static final int INT_X = 11;

        public static final org.apache.xmlbeans.StringEnumAbstractBase.Table table =
            new org.apache.xmlbeans.StringEnumAbstractBase.Table
        (
            new Enum[]
            {
                new Enum("under 6", INT_UNDER_6),
                new Enum("6", INT_X_6),
                new Enum("7", INT_X_7),
                new Enum("8", INT_X_8),
                new Enum("9", INT_X_9),
                new Enum("10", INT_X_10),
                new Enum("11", INT_X_11),
                new Enum("12", INT_X_12),
                new Enum("post secondary", INT_POST_SECONDARY),
                new Enum("college", INT_COLLEGE),
                new Enum("", INT_X),
            }
        );
        private static final long serialVersionUID = 1L;
        private java.lang.Object readResolve() { return forInt(intValue()); } 
    }

    /**
     * A factory class with static methods for creating instances
     * of this type.
     */

    public static final class Factory
    {
        public static gov.hhs.acf.nytd.EducationLevelType newValue(java.lang.Object obj) {
          return (gov.hhs.acf.nytd.EducationLevelType) type.newValue( obj ); }

        public static gov.hhs.acf.nytd.EducationLevelType newInstance() {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().newInstance( type, null ); }

        public static gov.hhs.acf.nytd.EducationLevelType newInstance(org.apache.xmlbeans.XmlOptions options) {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().newInstance( type, options ); }

        /** @param xmlAsString the string value to parse */
        public static gov.hhs.acf.nytd.EducationLevelType parse(java.lang.String xmlAsString) throws org.apache.xmlbeans.XmlException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( xmlAsString, type, null ); }

        public static gov.hhs.acf.nytd.EducationLevelType parse(java.lang.String xmlAsString, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( xmlAsString, type, options ); }

        /** @param file the file from which to load an xml document */
        public static gov.hhs.acf.nytd.EducationLevelType parse(java.io.File file) throws org.apache.xmlbeans.XmlException, java.io.IOException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( file, type, null ); }

        public static gov.hhs.acf.nytd.EducationLevelType parse(java.io.File file, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( file, type, options ); }

        public static gov.hhs.acf.nytd.EducationLevelType parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( u, type, null ); }

        public static gov.hhs.acf.nytd.EducationLevelType parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( u, type, options ); }

        public static gov.hhs.acf.nytd.EducationLevelType parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( is, type, null ); }

        public static gov.hhs.acf.nytd.EducationLevelType parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( is, type, options ); }

        public static gov.hhs.acf.nytd.EducationLevelType parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( r, type, null ); }

        public static gov.hhs.acf.nytd.EducationLevelType parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( r, type, options ); }

        public static gov.hhs.acf.nytd.EducationLevelType parse(javax.xml.stream.XMLStreamReader sr) throws org.apache.xmlbeans.XmlException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( sr, type, null ); }

        public static gov.hhs.acf.nytd.EducationLevelType parse(javax.xml.stream.XMLStreamReader sr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( sr, type, options ); }

        public static gov.hhs.acf.nytd.EducationLevelType parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( node, type, null ); }

        public static gov.hhs.acf.nytd.EducationLevelType parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( node, type, options ); }

        /** @deprecated {@link org.apache.xmlbeans.xml.stream.XMLInputStream} */
        public static gov.hhs.acf.nytd.EducationLevelType parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( xis, type, null ); }

        /** @deprecated {@link org.apache.xmlbeans.xml.stream.XMLInputStream} */
        public static gov.hhs.acf.nytd.EducationLevelType parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
          return (gov.hhs.acf.nytd.EducationLevelType) org.apache.xmlbeans.XmlBeans.getContextTypeLoader().parse( xis, type, options ); }

        /** @deprecated {@link org.apache.xmlbeans.xml.stream.XMLInputStream} */
        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
          return org.apache.xmlbeans.XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }

        /** @deprecated {@link org.apache.xmlbeans.xml.stream.XMLInputStream} */
        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
          return org.apache.xmlbeans.XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }

        private Factory() { } // No instance of this class allowed
    }
}
于 2011-02-01T17:40:56.737 に答える