java – JAXB和集合中的继承

前端之家收集整理的这篇文章主要介绍了java – JAXB和集合中的继承前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我如何映射(通过 Java 1.6中的JAXB)集合到XML和XML,在哪里
  1. class mapping{
  2. @XmlElementWrapper(name="list")
  3. @XmlElement(name="item")
  4. Collection<A> list;
  5. }
  6.  
  7. abstract class A{
  8. }
  9.  
  10. class B extends A{
  11. public String onlyB;
  12. }
  13.  
  14. class C extends A{
  15. public String onlyC;
  16. }

我想看到这样的XML:

  1. <something> (doesnt matter,I'm using it in another structure)
  2. <list>
  3. <item xsi:type="b"><onlyB>b</onlyB></item>
  4. <item xsi:type="c"><onlyC>c</onlyC></item>
  5. </list>
  6. </something>

它的工作,如果我有

  1. class mapping{
  2. @XmlElement(name="item")
  3. A item;
  4. }

我已经尝试过xmlelementref,但没有成功

我不想使用@XmlElements({@ XmlElement …}),因为正在使用它的其他项目可以添加来自A的派生类

解决方法

您的映射似乎是正确的.您需要确保在创建JAXBContext时包含B和C类.实现此目的的一种方法是使用@XmlSeeAlso.
  1. @XmlSeeAlso(B.class,C.class)
  2. abstract class A{
  3. }

下面是使用xsi:type来表示使用JAXB的域模型中的继承的示例:

> http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html

如果要使用替换组的XML模式概念表示继承,则使用@XmlElementRef:

> http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-substitution.html

XmlElements对应于XML模式中的选择结构:

> http://blog.bdoughan.com/2010/10/jaxb-and-xsd-choice-xmlelements.html
> http://blog.bdoughan.com/2011/04/xml-schema-to-java-xsd-choice.html

完整的例子

以下是一个完整的例子:

制图

  1. package forum7672121;
  2.  
  3. import java.util.Collection;
  4.  
  5. import javax.xml.bind.annotation.*;
  6.  
  7. @XmlRootElement(name="something")
  8. @XmlAccessorType(XmlAccessType.FIELD)
  9. class Mapping{
  10. @XmlElementWrapper(name="list")
  11. @XmlElement(name="item")
  12. Collection<A> list;
  13. }

一个

  1. package forum7672121;
  2.  
  3. import javax.xml.bind.annotation.XmlSeeAlso;
  4.  
  5. @XmlSeeAlso({B.class,C.class})
  6. abstract class A{
  7. }

  1. package forum7672121;
  2.  
  3. class B extends A{
  4. public String onlyB;
  5. }

C

  1. package forum7672121;
  2.  
  3. class C extends A{
  4. public String onlyC;
  5. }

演示

  1. package forum7672121;
  2.  
  3. import java.io.File;
  4. import javax.xml.bind.*;
  5.  
  6. public class Demo {
  7.  
  8. public static void main(String[] args) throws Exception {
  9. JAXBContext jc = JAXBContext.newInstance(Mapping.class);
  10.  
  11. Unmarshaller unmarshaller = jc.createUnmarshaller();
  12. File xml = new File("src/forum7672121/input.xml");
  13. Mapping mapping = (Mapping) unmarshaller.unmarshal(xml);
  14.  
  15. Marshaller marshaller = jc.createMarshaller();
  16. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
  17. marshaller.marshal(mapping,System.out);
  18. }
  19.  
  20. }

input.xml中/输出

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <something>
  3. <list>
  4. <item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b">
  5. <onlyB>b</onlyB>
  6. </item>
  7. <item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="c">
  8. <onlyC>c</onlyC>
  9. </item>
  10. </list>
  11. </something>

猜你在找的Java相关文章