Java 如何编写模式,使序列中的元素映射到单独的属性,而不是一个列表<;对象>;在JAXB生成的类中?
我的.xsd文件中有以下类型: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
<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”是我想要的类型。@Michellexs:integer
是任意长度,即biginger
,xs:int
映射到可选元素的Javainteger
(当元素缺失时允许null
)而且int
是必需的。@IanR太棒了,int
正是我需要的,谢谢!我一开始并没有写模式,所以我也不确定是什么激发了这个设计,但是你对“混合”的描述解释了很多,我肯定可以删除它。我不需要BigInteger,不-我刚才假设的”整数”是我想要的类型。@Michellexs:integer
是任意长度,即biginger
,xs:int
映射到可选元素的Javainteger
(当元素缺失时允许null
)而且,int
是我所需要的。@I太棒了,int
正是我所需要的,谢谢!