Enums 枚举不';t匹配模式:jaxb或xsd有问题吗?
我正在尝试使用JAXB将数据解压到Java对象中。我知道J6中的SAX存在拒绝maxOccurs行的问题,我已将其更改为Enums 枚举不';t匹配模式:jaxb或xsd有问题吗?,enums,jaxb,unmarshalling,Enums,Jaxb,Unmarshalling,我正在尝试使用JAXB将数据解压到Java对象中。我知道J6中的SAX存在拒绝maxOccurs行的问题,我已将其更改为无界。但是,当我xjcit时,它并没有创建我需要的所有类和枚举。例如,应该有一个educationLevelTypeenum。此外,我还尝试了MS的xsd解组器,它可以正确地创建所有内容 一个比我更有经验的人能看看这个,告诉我我错过了什么吗?xsd中是否有需要更正的内容,或者JAXB中是否存在错误 更新 布莱斯完全回答了这个问题。不幸的是,IMHO,这使得JAXB一文不值。整个
无界
。但是,当我xjc
it时,它并没有创建我需要的所有类和枚举。例如,应该有一个educationLevelType
enum。此外,我还尝试了MS的xsd解组器,它可以正确地创建所有内容
一个比我更有经验的人能看看这个,告诉我我错过了什么吗?xsd中是否有需要更正的内容,或者JAXB中是否存在错误
更新
布莱斯完全回答了这个问题。不幸的是,IMHO,这使得JAXB一文不值。整个想法是,我可以从一个模式生成类——我不必事先知道关于结构的东西。如果我必须创建一个自定义绑定文件,我还可以创建一个模式来生成我想要的代码。但是,为什么要到此为止?为什么不跳过所有这些步骤,生成我想要的类呢
最后,一位同事向我指出,这个项目有点老,但它创建对象没有问题。Codehaus也有一个解决方案。有几个枚举值导致了这个问题。这些问题可以通过使用JAXB外部绑定文件来克服(见下文) 枚举问题#1-空字符串 某些枚举值为空字符串(“”),这会导致生成字符串而不是枚举属性:
<xs:enumeration value="">
<xs:annotation>
<xs:documentation>Blank</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="6">
<xs:annotation>
<xs:documentation>6th grade</xs:documentation>
</xs:annotation>
</xs:enumeration>
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);
}
}
这将导致生成以下枚举:
<xs:enumeration value="">
<xs:annotation>
<xs:documentation>Blank</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="6">
<xs:annotation>
<xs:documentation>6th grade</xs:documentation>
</xs:annotation>
</xs:enumeration>
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架构:
xjc -nv -d out http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd
正在分析架构。。。[错误]当前
解析器的配置不正确
允许使用maxOccurs属性值
设置为大于值5000。第41行 未能分析架构 了解更多信息
/*
* 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
}
}
/*
*XML类型:educationLevelType
*名称空间:http://nytd.acf.hhs.gov
*Java类型:gov.hhs.acf.nytd.EducationLevelType
*
*自动生成-不修改。
*/
包gov.hhs.acf.nytd;
/**
*XML educationLevelType(@http://nytd.acf.hhs.gov).
*
*这是一个原子类型,是对gov.hhs.acf.nytd.EducationLevelType的限制。
*/
公共接口EducationLevelType扩展org.apache.xmlbeans.XmlString
{
公共静态final org.apache.xmlbeans.SchemaType=(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集(org.apache.xmlbeans.StringEnumAbstractBase e);
_6下的静态最终枚举=枚举forString(“6下”);
静态最终枚举X_6=枚举forString(“6”);
静态最终枚举X_7=枚举forString(“7”);
静态最终枚举X_8=枚举forString(“8”);
静态最终枚举X_9=枚举forString(“9”);
静态最终枚举X_10=枚举forString(“10”);
静态最终枚举X_11=Enum.forString(“11”);
静态最终枚举X_12=枚举forString(“12”);
静态最终枚举POST_SECONDARY=Enum.forString(“POST SECONDARY”);
静态最终枚举学院=枚举forString(“学院”);
静态最终枚举X=Enum.forString(“”);
_6下的静态final int_=_6下的Enum.int_;
静态最终int_X_6=Enum.int_X_6;
静态final int_X_7=Enum.int_X_7;
静态final int_X_8=Enum.int_X_8;
静态final int_X_9=Enum.int_X_9;
静态最终int_X_10=Enum.int_X_10;
静态final int_X_11=Enum.int_X_11;
静态最终int_X_12=Enum.int_X_12;
静态最终int_POST_SECONDARY=Enum.int_POST_SECONDARY;
静态最终国际大学学院=Enum.int大学学院;
静态final int_X=Enum.int_X;
/**
*gov.hhs.acf.nytd.EducationLevelType的枚举值类。
*这些枚举值可按如下方式使用:
*
*enum.toString();//返回枚举的字符串值
*enum.intValue();//返回一个对开关有用的int值
*//例如,案例Enum.INT_在_6下
*Enum.forString;//返回字符串的枚举值
*forInt(i);//返回int的枚举值
*
*枚举对象是不可变的单例对象
*可以使用==对象相等进行比较。它们没有
*公共构造函数。请参阅此构造函数中定义的常量
*为所有有效值初始化。
*/
静态最终类枚举扩展org.apache.xmlbeans.StringEnumAbstractBase
{
/**
*返回字符串的枚举值,如果没有,则返回null。
*/
字符串的公共静态枚举(java.lang.String)
{return(Enum)table.forString(s);}
/**
*返回与int对应的枚举值,如果没有,则返回null。
*/
公共静态枚举forInt(int i)
{return(Enum)table.forInt(i);}
私有枚举(java.lang.String s,int i)
{super(s,i);}
6下的静态最终整数=1;
静态最终int_X_6=2;
静态最终整数X整数7=3;
静态最终整数X整数8=4;
静态最终int_X_9=5;
静态最终整数×10=6;
静态最终整数×11=7;
静态最终int_X_12=8;
静态最终积分后积分=9;
静态期末考i