有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用@XmlElement和@XmlRootElement在对象内部编组对象?

我见过许多JAXB的实现,其中我们可以使用@XmlElement注释将java原语转换为XML元素

但是,我想将以下POJO转换为XML(注意,employee类中有一个地址对象,而不仅仅是原语):

public class Employee {
    private Address address;
    private int employeeId;

    // constructors + setters + getters
}

如何使用这些JAXB注释将employee对象整理成XML

谢谢


共 (3) 个答案

  1. # 1 楼答案

    通过遵循下面给出的方法(即通过@XmlRootElement注释两个类),我能够用JAXB实现“对象内部对象”XML编组:

    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement
    public class Employee {
        @XmlElement
        private Address address;
         .
         .
    }
    
    @XmlRootElement
    public class Address {
        .
        .
    }
    
  2. # 2 楼答案

    使用Jaxb,您可以尝试以下代码。或者你可以试试Xstream

      @XmlRootElement
    public class TestObject {
    
        String a;
    
        TestObject1 anotherObject;
        public String getA() {
            return a;
        }
        @XmlElement
        public void setA(String a) {
            this.a = a;
        }
    
    
        public TestObject1 getAnotherObject() {
            return anotherObject;
        }
        @XmlElement
        public void setAnotherObject(TestObject1 anotherObject) {
            this.anotherObject = anotherObject;
        }
        public static void main(String[] args) throws JAXBException {
            TestObject object = new TestObject();
            object.setA("A");
            TestObject1 anotherObject = new TestObject1();
            anotherObject.setB("B");
            object.setAnotherObject(anotherObject);
            File file = new File("output.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(TestObject.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    
            jaxbMarshaller.marshal(object, file);
            jaxbMarshaller.marshal(object, System.out);
        }
    }
    

    ================================================

    @XmlRootElement
    public class TestObject1 {
    
        String b;
    
        public String getB() {
            return b;
        }
    
        @XmlElement
        public void setB(String b) {
            this.b = b;
        }
    
    }
    
  3. # 3 楼答案

    封送POJO属性与封送基元属性没有什么不同。引用的POJO类不需要用@XmlRootElement注释

    Java模型

    员工

    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement
    public class Employee {
    
        private Address address;
        private int employeeId;
    
        public Address getAddress() {
            return address;
        }
    
        public void setAddress(Address address) {
            this.address = address;
        }
    
        public int getEmployeeId() {
            return employeeId;
        }
    
        public void setEmployeeId(int employeeId) {
            this.employeeId = employeeId;
        }
    
    }
    

    地址

    要将Address编组为Employee的一部分,没有什么特别的事情需要做

    public class Address {
    
        private String street;
    
        public String getStreet() {
            return street;
        }
    
        public void setStreet(String street) {
            this.street = street;
        }
    
    }
    

    演示代码

    下面是一些演示代码,它们将填充员工模型并将其封送到XML

    演示

    import javax.xml.bind.*;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Employee.class);
    
            Address address = new Address();
            address.setStreet("1 A Street");
    
            Employee employee = new Employee();
            employee.setEmployeeId(123);
            employee.setAddress(address);
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(employee, System.out);
        }
    
    }
    

    输出

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <employee>
        <address>
            <street>1 A Street</street>
        </address>
        <employeeId>123</employeeId>
    </employee>
    

    重命名编组的元素

    如果要覆盖默认元素名,则可以使用@XmlElement注释,而不管属性是什么类型

    员工

    import javax.xml.bind.annotation.*;
    
    @XmlRootElement
    public class Employee {
    
        private Address address;
        private int employeeId;
    
        @XmlElement(name="ADDR")
        public Address getAddress() {
            return address;
        }
    
        public void setAddress(Address address) {
            this.address = address;
        }
    
        @XmlElement(name="ID")
        public int getEmployeeId() {
            return employeeId;
        }
    
        public void setEmployeeId(int employeeId) {
            this.employeeId = employeeId;
        }
    
    }
    

    输出

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <employee>
        <ADDR>
            <street>1 A Street</street>
        </ADDR>
        <ID>123</ID>
    </employee>