【问题标题】:Deserializing XML file without converting xml file反序列化 XML 文件而不转换 xml 文件
【发布时间】:2014-10-28 13:06:26
【问题描述】:

以下 xml 由系统生成,需要通过 Java 应用程序转换为 Employee 类型的对象。

<?xml version="1.0" encoding="utf-8"?>
<Employee xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
 <Designation>Executive</Designation>
 <Name>Praveen Kumar</Name>
 <Salary>90000</Salary>
<BankAccount>10111</BankAccount>
</Employee>

如何使用 XmlDecoder 的 readObject 方法对上述 XML 进行反序列化,而不像其他系统生成的那样转换 xml 文件?

【问题讨论】:

  • “不转换xml文件”是什么意思?为什么一定要用XmlDecoder?这实际上是 XML 格式吗?如果是这样,手动编写反序列化代码几乎是微不足道的。

标签: java xml serialization


【解决方案1】:

以下是处理用例的方法:

Java 模型

以下类将用于此答案:

package forum26609152;

public class Employee {

    private String designation;
    private String name;
    private int salary;
    private String bankAccount;

    public String getDesignation() {
        return designation;
    }

    public void setDesignation(String designation) {
        this.designation = designation;
    }

    public String getName() {
        return name;
    }

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

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public String getBankAccount() {
        return bankAccount;
    }

    public void setBankAccount(String bankAccount) {
        this.bankAccount = bankAccount;
    }

}

XMLEncoder/XMLDecoder

以下是 XMLEncoder/XMLDecoder 期望使用的 XML。它与您问题中的 XML 非常不同。 XMLEncoder/XMLDecoder 不适合您的用例。

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_60" class="java.beans.XMLDecoder">
 <object class="forum26609152.Employee">
  <void property="bankAccount">
   <string>10111</string>
  </void>
  <void property="designation">
   <string>Executive</string>
  </void>
  <void property="name">
   <string>Praveen Kumar</string>
  </void>
  <void property="salary">
   <int>90000</int>
  </void>
 </object>
</java>

JAXB

JAXB 是用于对象到 XML 绑定的标准 API。自 Java SE 6 起,JDK/JRE 中已包含一个实现,因此您已经拥有它。

员工

Java 和 XML 之间的映射是通过注解配置的。以下是将 Java 对象映射到您问题中的 XML 所需的注释。

import javax.xml.bind.annotation.*;

@XmlRootElement(name="Employee")
@XmlType(propOrder = {"designation", "name", "salary", "bankAccount"})
public class Employee {

    private String designation;
    private String name;
    private int salary;
    private String bankAccount;

    @XmlElement(name="Designation")
    public String getDesignation() {
        return designation;
    }

    public void setDesignation(String designation) {
        this.designation = designation;
    }

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

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

    @XmlElement(name="Salary")
    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    @XmlElement(name="BankAccount")
    public String getBankAccount() {
        return bankAccount;
    }

    public void setBankAccount(String bankAccount) {
        this.bankAccount = bankAccount;
    }

}

演示代码

以下是您需要编写的代码,用于将 XML 读取为对象形式,然后将其输出回 XML。

import javax.xml.bind.*;
import java.io.File;

public class JaxbDemo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Employee.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("input.xml");
        Employee employee = (Employee) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(employee, System.out);
    }

}

input.xml/Output

如您所见,这是您问题中的 XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Employee>
    <Designation>Executive</Designation>
    <Name>Praveen Kumar</Name>
    <Salary>90000</Salary>
    <BankAccount>10111</BankAccount>
</Employee>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2019-09-24
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多