jaxb多态解析

父类Student.class

import javax.xml.bind.annotation.XmlSeeAlso;
//使用@XmlSeeAlso注解: 您需要在父类上使用@XmlSeeAlso注解,
//将所有可能的子类添加到注解中,以告知JAXB在处理对象时考虑这些子类。
@XmlSeeAlso({Student1.class,Student2.class})
public class Student {
}

子类Student1.class

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Student")//从父类进行xml解析时,名字设定
public class Student1 extends Student{

    private String name;

    public Student1() {
    }

    @XmlElement(name = "Name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

子类Student2.class

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Student")
public class Student2 extends Student{
    private String name;
    public Student2() {
    }
    @XmlElement(name = "Name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Person类

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Person")
public class Person {
    private String id;
    private Student student;
    public Person() {
    }
    @XmlElement(name = "Id")
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
//在JAXB中,如果你有一个包含多个不同子类实例的集合,并且希望能够正确地将这些子类实例反序列化回对象,
//并且在序列化时能够正确地指定实际子类的元素名称,就可以使用@XmlElementRef。

//这个注解通常与@XmlSeeAlso注解一起使用,后者用于指定在多态性情况下JAXB需要处理的可能的子类。
    @XmlElementRef
    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }
}

测试用例

    @Test
    public void jaxb(){
        Person person = new Person();
        person.setId("001");
        Student1 s1 = new Student1();
        s1.setName("zs");
        person.setStudent1(s1);
        Student1 s2 = new Student1();
        s2.setName("ls");
        person.setStudent2(s2);
        JAXBContext context;
        try {
            context = JAXBContext.newInstance(Person.class);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(person, System.out);
        } catch (JAXBException e) {
            System.out.println(e);
            e.printStackTrace();
        }
    }

结果

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Person>
    <Id>001</Id>
    <Student>
        <Name>zs</Name>
    </Student>
    <Student>
        <Name>ls</Name>
    </Student>
</Person>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JAXBJava Architecture for XML Binding)是Java中用于将XML文档与Java对象之间进行映射的技术。它提供了一种简单的方式来将XML数据转换为Java对象,以及将Java对象转换为XML数据。 下面是使用JAXB解析XML的基本步骤: 1. 创建一个Java类,该类将作为XML数据的映射对象。该类需要使用JAXB注解来指定XML元素和属性与Java字段之间的映射关系。 2. 使用JAXB的上下文(JAXBContext)创建一个Unmarshaller对象,用于将XML数据转换为Java对象。 3. 调用Unmarshaller对象的unmarshal()方法,传入XML数据的来源(可以是文件、输入流等),将XML数据解析Java对象。 下面是一个简单的示例代码,演示了如何使用JAXB解析XML: ```java import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import java.io.File; public class JAXBExample { public static void main(String[] args) { try { // 创建JAXB上下文 JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); // 创建Unmarshaller Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // 加载XML文件 File xmlFile = new File("person.xml"); // 解析XML并将其转换为Java对象 Person person = (Person) unmarshaller.unmarshal(xmlFile); // 打印Java对象的属性 System.out.println("Name: " + person.getName()); System.out.println("Age: " + person.getAge()); } catch (JAXBException e) { e.printStackTrace(); } } } ``` 在上面的示例中,我们创建了一个名为Person的Java类,并使用JAXB注解指定了XML元素与Java字段之间的映射关系。然后,我们使用JAXBContext创建了一个Unmarshaller对象,并将XML文件解析为Person对象。最后,我们打印了Person对象的属性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值