Java 使用JAXB并根据封闭标记对同一标记进行不同的解释

Java 使用JAXB并根据封闭标记对同一标记进行不同的解释,java,xml,jaxb,unmarshalling,Java,Xml,Jaxb,Unmarshalling,在下面的示例中,A内的数据块和B内的数据块应解组为不同的类。使用JAXB可以实现这一点吗 <Content> <A> <Data> <Name></Name> <Age></Age> </Data> </A> <B> <Data> <MobilePhone></MobilePh

在下面的示例中,A内的数据块和B内的数据块应解组为不同的类。使用JAXB可以实现这一点吗

<Content>
  <A>
    <Data>
      <Name></Name>
      <Age></Age>
    </Data>
  </A>
  <B>
    <Data>
      <MobilePhone></MobilePhone>
      <WorkPhone></WorkPhone>
    </Data>
  </B>
</Content>
A中的数据和B中的数据代表不同的类。A中的数据应该映射到AData.class,B中的数据应该映射到BData.class


注意:编组工作正常。任何数量的类都可以具有相同的名称标记。生成的xml包含所有这些类的相同标记。在本例中,AData和BData都将作为XML文件写入。但是,即使是相同的封送xml也不能再次取消封送。我希望可以通过添加一些附加注释来解决这个问题。

您只需要具备以下功能:

@XmlAccessorType(XmlAccessType.FIELD)
public class A {

    @XmlElement(name="Data")
    private AData data;

}
@XmlAccessorTypeXmlAccessType.FIELD 公共B级{ @XmlElementname=数据 私有数据; } @XmlRootElementname=内容 @XmlAccessorTypeXmlAccessType.FIELD 公开课内容{ @xmlementname=A 私人A; @xmlementname=B 私人B,; }
如果您提前知道内容将包含的对象,Blaise发布的解决方案将是解决此问题的好方法,例如:

public class Content {

    @XmlElement(name="A")
    private A a;

    @XmlElement(name="B")
    private B b;

}
但另一种方法是将内容中可能包含的数据包装在a/B扩展的某个超类型的列表中,从而生成如下所示的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Content>
    <myContent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="a">
        <Data>
            <Name>Joe Smith</Name>
            <Age>25</Age>
        </Data>
    </myContent>
    <myContent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b">
        <Data>
            <MobilePhone>555-234-5678</MobilePhone>
            <WorkPhone>555-555-5555</WorkPhone>
        </Data>
    </myContent>
</Content>
您可以通过如下方式注释类来实现这一点:

@XmlRootElement(name = "Content")
@XmlAccessorType(XmlAccessType.FIELD)
public class Content {
    @XmlElement
    List<SomeSuperType> myContent;

    public Content() {

    }

    public List<SomeSuperType> getMyContent() { return this.myContent; }
    public void setMyContent(List<SomeSuperType> myContent ) { this.myContent = myContent; }
}

// class for A
@XmlRootElement(name = "A")
@XmlAccessorType(XmlAccessType.FIELD)
public class A extends SomeSuperType {
    @XmlElement(name="Data")
    AData data;

    public A() {
        data = new AData();
    }

    public void setName(String name) {
        data.name = name;
    }
    public void setAge(int age) {
        data.age = age;
    }

    public String getName() { return data.name; }
    public int getAge() { return data.age; }
}

class AData {
    @XmlElement(name = "Name")
    String name;
    @XmlElement(name = "Age")
    int age;
}


// class for B
@XmlRootElement(name = "B")
@XmlAccessorType(XmlAccessType.FIELD)
public class B extends SomeSuperType {
    @XmlElement(name = "Data")
    BData data;

    public B() {
        data = new BData();
    }

    public void setMobilePhone(String mobilePhone) { data.mobilePhone = mobilePhone; }
    public void setWorkPhone(String workPhone) { data.workPhone = workPhone; }
    public String getMobilePhone() { return data.mobilePhone; }
    public String getWorkPhone() { return data.workPhone; }
}

class BData {
    @XmlElement(name="MobilePhone")
    String mobilePhone;
    @XmlElement(name="WorkPhone")
    String workPhone;
    public BData() {

    }
}

这种简单的娱乐活动效果很好。但是,我的稍微复杂一点的项目代码不起作用,项目代码也工作得很好:日志被修剪了。我没有检查好。JAXB很好。我还必须使用XmlRootElement对类AData和BData进行注释,对吗?@Teddy-如果您希望能够将其解组为顶级对象,而不必指定类参数,则只需要在类上使用@XmlRootElement注释: