有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将多个XML元素添加到同一个类中

我想用JAXB执行以下操作,但不知道如何执行。我将首先向您展示一些代码,然后是详细信息

@XmlRootElement(name = "root")
public class RootClass {    
    @XmlElementWrapper("foos")
    // ?? - I do not want to list here all my xml element 
    // types with @XmlElements({...})
    private List<Foo> fooList;    
}

public class Foo {    
    @XmlTransient
    // how to map the element's type (based on the xml element)
    // into this attribute?
    private FooType type;

    @XmlElement(name = "something", type = Something.class)
    private Something something;    
}

public class Baz extends Foo {
    @XmlElement(name = "somethingMore", type = SomethingMore.class)
    private SomethingMore more;
}

public enum FooType {
    BAR,
    QUX
}

以及XML结构:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="mynamespace"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="myschemalocation">

    <foos>
        <bar>
            <something ... />
        </bar>
        <qux>
            <something ... />
        </qux>
        <baz>
            <something ... />
            <somethingMore ... />
        </baz>
    </foos>
</root>

因此,我有上面的类和XML结构。几乎我所有的Foo-s都几乎相同,但它们在FooType属性上有所不同。但是我的一些Foo-s非常不同:我想为它们创建一个新类(扩展原始Foo)。在本例中,该类称为Baz

有了JAXB,是否可以解组这个结构?在本例的最后,我想得到一个RootClass对象,它有一个包含3个元素的列表:

  • 一个Foo对象,其类型为BAR
  • 一个Foo对象,其类型为QUX
  • 和一个Baz对象

有可能吗,以某种方式使用JAXB?我找了好几个小时了。我试图创建一个带有@XmlRegistry@XmlElementDecl注释的“ObjectFactory”,但我不确定该怎么做


共 (1) 个答案

  1. # 1 楼答案

    您可以根据以下两种可能性之一使用XML模式。不同之处在于要求有一个混合列表,而不是三个同质列表的序列

    首先是混合名单:

    <xsd:element name="root" type="RootType"/>
    <xsd:complexType name="RootType">
      <xsd:choice maxOccurs="unbounded">
        <xsd:element name="bar" type="FooType"/>
        <xsd:element name="qux" type="FooType"/>
        <xsd:element name="baz" type="BazType"/>
      </xsd:choice>
    </xsd:complexType>
    

    这将导致(在类根类型中)出现

    protected List<JAXBElement<? extends FooType>> barOrQuxOrBaz;
    

    其中,JAXBElement允许您提取一个Qname,用于标识元素(基本上是bar/qux/baz的区别)和未编组元素的POJO

    另一个变体没有那么凌乱w.r.t.结果API:

    <xsd:element name="root" type="RootType"/>
    <xsd:complexType name="RootType">
      <xsd:sequence>
        <xsd:element name="bar" type="FooType"
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="qux"  maxOccurs="unbounded" type="FooType"
                     minOccurs="0" maxOccurs="unbounded"/>            
        <xsd:element name="baz" type="BazType"
                     minOccurs="0" maxOccurs="unbounded"/>     
      </xsd:sequence>
    </xsd:complexType>
    

    这将为您提供非常简单的

    protected List<FooType> bar;
    protected List<FooType> qux;
    protected List<BazType> baz;