gpt4 book ai didi

java - 使用 jaxb2 时如何根据 type 属性构造 xml 元素?

转载 作者:行者123 更新时间:2023-11-30 04:47:44 24 4
gpt4 key购买 nike

我正在使用 java jaxb2.0 进行 xml 编码解码
我遇到了这样的问题。
示例 xml 如下所示*(fruit.xml)*:

<fruitPacks>
<fruit name="apple1" type="apple" isApple="true"/>
<fruit name="banana1" type="banana" isBanana="true"/>
<fruit name="apple2" type="apple" isApple="true"/>
</fruitPacks>

和这样的java类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "fruitPacks")
@XmlRootElement
public class FruitPacks
{
@XmlElement(name = "fruit")
private List<Fruit> fruits
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "fruit")
@XmlSeeAlso({ Apple.class, Banana.class })
public class Fruit{
@XmlAttribute
private String name;
@XmlAttribute
private String type;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "apple")
public class Apple extends Fruit{
@XmlAttribute
private boolean isApple = true;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "banana")
public class Banana extends Fruit{
@XmlAttribute
private boolean isBanana = true;
}

解码代码是:

public class JAXBTest {

public static void main(String [] args) throws Exception{
JAXBContext jc = JAXBContext.newInstance(FruitPacks.class,Fruit.class,Apple.class, Banana.class);

Unmarshaller unmarshaller = jc.createUnmarshaller();
Object obj = unmarshaller.unmarshal(new File("fruit.xml"));
System.out.println(obj);
}
}

所以我想做的是:
当解码 xml 时,水果的构造将根据 type 属性自动完成到子类(Apple、Banana)。
我该怎么做?

最佳答案

您需要确保您的 JAXBContext 知道子类。一种方法是使用 @XmlSeeAlso 注释,请参阅下面的示例:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "fruit")
@XmlSeeAlso({Apple.class, Banana.class})
public class Fruit{
@XmlAttribute
private String name;
@XmlAttribute
private String type;
}

了解更多信息

<小时/>

更新

我刚刚意识到您使用的是 type 属性,而不是标准的 xsi:type 属性。对于任何 JAXB 实现,您都可以利用 XmlAdapter 映射此用例:

如果您使用 EclipseLink JAXB (MOXy),那么您可以利用 @XmlDecriminatorNode/@XmlDecriminatorValue 扩展:

关于java - 使用 jaxb2 时如何根据 type 属性构造 xml 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10595096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com