我如何映射(通过
Java 1.6中的JAXB)集合到XML和XML,在哪里
- class mapping{
- @XmlElementWrapper(name="list")
- @XmlElement(name="item")
- Collection<A> list;
- }
- abstract class A{
- }
- class B extends A{
- public String onlyB;
- }
- class C extends A{
- public String onlyC;
- }
我想看到这样的XML:
- <something> (doesnt matter,I'm using it in another structure)
- <list>
- <item xsi:type="b"><onlyB>b</onlyB></item>
- <item xsi:type="c"><onlyC>c</onlyC></item>
- </list>
- </something>
它的工作,如果我有
- class mapping{
- @XmlElement(name="item")
- A item;
- }
我已经尝试过xmlelementref,但没有成功
我不想使用@XmlElements({@ XmlElement …}),因为正在使用它的其他项目可以添加来自A的派生类
解决方法
您的映射似乎是正确的.您需要确保在创建JAXBContext时包含B和C类.实现此目的的一种方法是使用@XmlSeeAlso.
- @XmlSeeAlso(B.class,C.class)
- abstract class A{
- }
下面是使用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
完整的例子
以下是一个完整的例子:
制图
- package forum7672121;
- import java.util.Collection;
- import javax.xml.bind.annotation.*;
- @XmlRootElement(name="something")
- @XmlAccessorType(XmlAccessType.FIELD)
- class Mapping{
- @XmlElementWrapper(name="list")
- @XmlElement(name="item")
- Collection<A> list;
- }
一个
- package forum7672121;
- import javax.xml.bind.annotation.XmlSeeAlso;
- @XmlSeeAlso({B.class,C.class})
- abstract class A{
- }
乙
- package forum7672121;
- class B extends A{
- public String onlyB;
- }
C
- package forum7672121;
- class C extends A{
- public String onlyC;
- }
演示
- package forum7672121;
- import java.io.File;
- import javax.xml.bind.*;
- public class Demo {
- public static void main(String[] args) throws Exception {
- JAXBContext jc = JAXBContext.newInstance(Mapping.class);
- Unmarshaller unmarshaller = jc.createUnmarshaller();
- File xml = new File("src/forum7672121/input.xml");
- Mapping mapping = (Mapping) unmarshaller.unmarshal(xml);
- Marshaller marshaller = jc.createMarshaller();
- marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
- marshaller.marshal(mapping,System.out);
- }
- }
input.xml中/输出
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <something>
- <list>
- <item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b">
- <onlyB>b</onlyB>
- </item>
- <item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="c">
- <onlyC>c</onlyC>
- </item>
- </list>
- </something>