Java 使用JAXB并根据封闭标记对同一标记进行不同的解释
在下面的示例中,A内的数据块和B内的数据块应解组为不同的类。使用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
<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注释: