Java 如何编写模式,使序列中的元素映射到单独的属性,而不是一个列表<;对象>;在JAXB生成的类中?

Java 如何编写模式,使序列中的元素映射到单独的属性,而不是一个列表<;对象>;在JAXB生成的类中?,java,xml,jaxb,xsd,xjc,Java,Xml,Jaxb,Xsd,Xjc,我的.xsd文件中有以下类型: <complexType name='FooType' mixed='true'> <sequence> <element name='Bar' minOccurs='0' type='xenc:BarType'/> <element name='Baz' minOccurs='0' type='base64Binary'/> <any namespace='##other' min

我的.xsd文件中有以下类型:

<complexType name='FooType' mixed='true'>
  <sequence>
    <element name='Bar' minOccurs='0' type='xenc:BarType'/>
    <element name='Baz' minOccurs='0' type='base64Binary'/>
    <any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
  </sequence>
  <attribute name='Moo' type='anyURI' use='required'/>
</complexType>

<simpleType name='BarType'>
  <restriction base="integer"/>
</simpleType>
我需要访问
Bar
元素的值,但它作为
JAXBElement
列表中,我必须在我的业务逻辑中硬编码QName,以确保我有正确的东西


如何修改模式以在生成的类中获得
属性?生成新类的
列表
列表
都可以工作。(这并不理想,但如果我能知道每一项都是“bar”元素,并且只需要处理值,那么即使是
列表栏
也能工作。)

第一件事是:你真的需要
mixed=“true”
?这意味着在FooType的所有子元素之间也可能有内容。这意味着您需要一些东西来存储字符串(用于子元素之前、之间和之后的内容)、一个条、一个Baz以及
xs:any
的任何内容。真是一种疯狂的混合

如果没有混合,xjc将生成:

public class FooType {
    @XmlElement(name = "Bar")
    protected BigInteger bar;
    @XmlElement(name = "Baz")
    protected byte[] baz;
    @XmlAnyElement(lax = true)
    protected List<Object> any;
    @XmlAttribute(name = "Moo", required = true)
    @XmlSchemaType(name = "anyURI")
    protected String moo;
公共类FooType{
@xmlement(name=“Bar”)
受保护的大整数条;
@xmlement(name=“Baz”)
受保护字节[]baz;
@xmlanyement(lax=true)
任何受保护的清单;
@xmltattribute(name=“Moo”,required=true)
@XmlSchemaType(name=“anyURI”)
保护串moo;
(您真的需要BigInteger吗??)

如果需要
mixed=“true”
,则必须测试QName值。如果列表元素的类是不同的,则可能有一点机会避免这种情况,但字符串将出现在文本子元素、Baz元素以及以后的(“any”)中,一切都是可能的


不确定是什么激发了这种XML模式设计,但更好的替代方案并不是不可想象的。

第一件事是:您真的需要
mixed=“true”
?这意味着在FooType的所有子元素之间也可能有内容。这意味着您需要一些东西来存储字符串的混合(对于子元素之前、之间和之后的内容)、一个条、一个Baz以及
xs:any
的任何内容。这真是一种疯狂的混合

如果没有混合,xjc将生成:

public class FooType {
    @XmlElement(name = "Bar")
    protected BigInteger bar;
    @XmlElement(name = "Baz")
    protected byte[] baz;
    @XmlAnyElement(lax = true)
    protected List<Object> any;
    @XmlAttribute(name = "Moo", required = true)
    @XmlSchemaType(name = "anyURI")
    protected String moo;
公共类FooType{
@xmlement(name=“Bar”)
受保护的大整数条;
@xmlement(name=“Baz”)
受保护字节[]baz;
@xmlanyement(lax=true)
任何受保护的清单;
@xmltattribute(name=“Moo”,required=true)
@XmlSchemaType(name=“anyURI”)
保护串moo;
(您真的需要BigInteger吗??)

如果需要
mixed=“true”
,则必须测试QName值。如果列表元素的类是不同的,则可能有一点机会避免这种情况,但字符串将出现在文本子元素、Baz元素以及以后的(“any”)中,一切都是可能的


不确定是什么推动了这种XML模式设计,但更好的替代方案也不是不可想象的。

我并没有首先编写模式,所以我也不确定是什么推动了这种设计,但您对“混合”的描述解释了很多,我可以肯定地删除它。我不需要BigInteger,不-我刚刚假设过“integer”是我想要的类型。@Michelle
xs:integer
是任意长度,即
biginger
xs:int
映射到可选元素的Java
integer
(当元素缺失时允许
null
)而且
int
是必需的。@IanR太棒了,
int
正是我需要的,谢谢!我一开始并没有写模式,所以我也不确定是什么激发了这个设计,但是你对“混合”的描述解释了很多,我肯定可以删除它。我不需要BigInteger,不-我刚才假设的”整数”是我想要的类型。@Michelle
xs:integer
是任意长度,即
biginger
xs:int
映射到可选元素的Java
integer
(当元素缺失时允许
null
)而且,
int
是我所需要的。@I太棒了,
int
正是我所需要的,谢谢!