使用 JAXB 编组/解组 Java 超类和子类

2023-11-29

我一直在尝试 JAXB 教程,并设法使代码能够从 Java 对象生成 XML 文件,然后能够使用 XML 生成 Java 对象。目前,它读取同一类的多个实例来创建一个类似于以下文件的 XML 文件

<Car>
    <regplate>TR54</regplate>
    <colour>red</colour>
    <energyrating>5</energyrating>
</Car>
<Car>
    <regplate>BN04 THY</regplate>
    <colour>yellow</colour>
    <energyrating>3</energyrating>
</Car>
<Car>
    <regplate>BN05 THY</regplate>
    <colour>yellow</colour>
    <energyrating>5</energyrating>
</Car>

我希望能够使用 JAXB 技术来处理子类。例如:假设我有一个 Car、Van 和 Bicycle 对象,它们是 Vehicle 的子类。我是否可以操作 JAXB 类来编写一个 XML 文件来生成与此类似的内容?我在下面提供了我正在使用的代码。

<Vehicle>
    <Car>
        <regplate>TR54</regplate>
        <colour>red</colour>
        <energyrating>5</energyrating>
    </Car>
    <Van>
        <regplate>MN05 RFD</regplate>
        <colour>red</colour>
        <energyrating>5</energyrating>
    </Van>
    <Car>
        <regplate>ZX54 UJK</regplate>
        <colour>red</colour>
        <energyrating>1</energyrating>
    </Car>
</Vehicle>

主班

package basictransport2;

public class Main
{
    public static void main(String[] args)
    {
        JAXB parser = new JAXB();
        parser.marshall();
        //parser.unmarshallList();
    }
}

车辆类别

package basictransport2;

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

//@XmlRootElement(name = "Vehicle")
public class Vehicle
{
    private int ownerId;

    public Vehicle(int ownerId)
    {
        this.setOwnerId(ownerId);
    }

    //@XmlElement (name = "Owner ID")
    public int getOwnerId()
    {
        return ownerId;
    }

    public void setOwnerId(int ownerId)
    {
        this.ownerId = ownerId;
    }


    public int getEnergyRating()
    {
        return (Integer) null;
    }


    public String getColour()
    {
        return null;
    }

    public String getRegPlate()
    {
        return null;
    }
}

汽车类

package basictransport2;

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

//@XmlRootElement(name = "Car")
public class Car extends Vehicle
{
    private String regPlate;
    private int energyRating;
    private String colour;

    public Car(String regPlate, int energyRating, String colour, int ownerId)
    {
        super(ownerId);
        this.regPlate = regPlate;
        this.energyRating = energyRating;
        this.colour = colour;
    } 

    public Car(int ownerId)
    {
        super(ownerId);
    }

    //@XmlElement (name = "Registration")
    public String getRegPlate()
    {
        return regPlate;
    }

    public void setRegPlate(String regPlate)
    {
        if(this.regPlate == null)
        {
            this.regPlate = regPlate;
        }
    }

    //@XmlElement (name = "Energy Rating")
    public int getEnergyRating()
    {
        return energyRating;
    }

    public void setEnergyRating(int energyRating)
    {
        this.energyRating = energyRating;
    }

    //@XmlElement (name = "Colour")
    public String getColour()
    {
        return colour;
    }

    public void setColour(String colour)
    {
        this.colour = colour;
    }
}

JAXB级

package basictransport2;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class JAXB
{   
    public void marshall()
    {
        try
        {
            List<Vehicle> vehicleList = new ArrayList<Vehicle>();

            vehicleList.add(new Car("SG09 TYH", 4, "Yellow", 1));
            vehicleList.add(new Car("XX09 VVV", 3, "Red", 2));
            vehicleList.add(new Car("BL09 TYZ", 4, "Blue", 3));

            Garage listOfVehicles = new Garage();
            listOfVehicles.setListOfVehicles(vehicleList);

            JAXBContext context = JAXBContext.newInstance(Garage.class);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(listOfVehicles, System.out);
            marshaller.marshal(listOfVehicles, new File("src\\data\\listcar.xml"));
        }

        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
    }

    public void unmarshall()
    {
        try
        {
            JAXBContext context = JAXBContext.newInstance(Garage.class);
            Unmarshaller unmarhsaller = context.createUnmarshaller();
            Garage listOfVehicles = (Garage)unmarhsaller.unmarshal(new File("src\\data\\listcar.xml"));
            System.out.println("List Car information");

            for(Vehicle vehicle : listOfVehicles.getListOfVehicles())
            {
                System.out.println("Reg Plate: " + vehicle.getRegPlate());
                System.out.println("Energy Rating: " + vehicle.getEnergyRating());
                System.out.println("Colour: " + vehicle.getColour());
                System.out.println("================");
            }    
        }

        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

列表类

package basictransport2;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="Vehicle")
public class Garage
{
    @XmlElements
    ({
        @XmlElement(name = "Car", type = Car.class, required = false)
    })    

    private List<Vehicle> vehicleCollection = new ArrayList<Vehicle>();

    public List<Vehicle> getListOfVehicles()
    {
        return vehicleCollection;
    }

    public void setListOfVehicles(List<Vehicle> listOfVehicles)
    {
        this.vehicleCollection = listOfVehicles;
    }
}

谢谢各位的意见。我使用了您所有答案的反馈,但最终它们的组合起作用了,这就是为什么我为将来可能遇到此问题的任何人创建了一个单独的答案。

为了让它工作,我必须确保正在编组/解组的超类和子类中的所有 getter 方法都用注释@XmlElement。这将确定相应变量的 XML 标记。

@XmlElement (name = "OwnerID")
    public int getOwnerId()
    {
        return ownerId;
    }

超类必须注释为@XmlSeeAlso将子类绑定到它。即在我的代码中RoadVehicle是超类,并且都是Car and Van课程扩展了它。

@XmlSeeAlso({Car.class, Van.class})
public class Vehicle
{

现在,超级类和子类都已注释,唯一需要注释的其他类是列表类(我的代码中的 Garage)。此处的更改将确定 XML 标记的填充内容。

根 XML 标记是通过应用@XmlRootElement注释到类的顶部。即“Vehicle”将是我的示例中的根 XML 标记。

@XmlRootElement(name = "Vehicle")
public class Garage
{

最后一个@XmlElements清单必须以@XmlElements每个需要 XML 标记的子类的注释name提供 XML 标记的名称。该列表必须在集合的 getter 方法之上声明。

@XmlElements
    ({
        @XmlElement(name = "Car", type = Car.class, required = false),
        @XmlElement(name = "Van", type = Van.class, required = false)
    })    
    public List<Vehicle> getListOfVehicles()
    {
        return vehicleCollection;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JAXB 编组/解组 Java 超类和子类 的相关文章

  • 如何在Java 8中实现Elvis运算符?

    我有一个经典的 Elvis 运算符 案例 其中我调用每个可能返回 null 的方法并将它们链接在一起 thing nullableMethod1 a nullableMethod2 b nullableMethod3 在 Java 8 中
  • 使用 AbstractTableModel 获取 JTable 中选定的行

    我有一个JTable using AbstractTableModel我在哪里有一个JCheckBox在第一列中用于选择行 现在 我需要从已检查的表中获取选定的行 现在 我按顺序从第一行遍历到最后一行并获取所有选择的行 如下所示 List
  • Java:高性能消息传递(单生产者/单消费者)

    我最初问这个问题here https stackoverflow com questions 3367192 java is while true loop in a thread bad whats the alternative 但我意
  • 使用 Android WebViewClient 启用特定 SSL 协议

    我的应用程序使用WebViewClient与服务器建立 SSL 连接 服务器配置为仅接受 TLSv1 1 及以上协议 使用 Android 时 如何检查哪些 SSL 协议是 a 支持的和 b 默认启用的WebViewClient在设备上 如
  • 如何测试调用父类的受保护(不需要的)方法的方法?

    我陷入了一个非常奇怪的情况 我有一些需要测试的特定代码 这里是 public class A The real method of real class is so big that I just don t want to test it
  • @OneToMany 与 @JoinTable 错误

    我试图理解 OneToMany with JoinTable 对于这样的场景 我正在使用 JPA 2 1 Hibernate 5 0 4 和 Oracle 11 XE 当我打电话时userDao save user 下面的代码 我有 jav
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 如何修复 Android 7.0 的 Spinner 模式下的 DatePickerDialog?

    我目前正在开发一个简单的项目 其中包含一个包含在 Web 视图中的网站 具有少量交互 以提高网站本身和 Android 移动设备之间的交互性 由于该网站包含用户生日的日期输入字段 因此我希望实现一个与所有设备兼容的旋转格式的日期选择器 我尝
  • 尝试在java中的Arraylist中查找对象的所有出现

    我有一个 Java ArrayList 我需要查找其中出现的所有特定对象 ArrayList indexOf Object 方法只找到一次出现 所以看来我还需要其他东西 我认为你不需要太花哨 以下应该可以正常工作 static
  • 支持通过 OAuth 进行 Facebook/Twitter 身份验证的 CAS 服务器

    我正在寻找一个支持 Facebook Twitter 通过 OAuth 进行单点登录身份验证的 CAS 服务器 我检查过 JASIG CAS 服务器 但它看起来不支持它们 我的 java web 应用程序基于 Spring Security
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通
  • BlackBerry SQLite:将一个 SQLite 数据库连接到另一个

    我正在尝试使用 SQLite 将一个 SQLite 数据库附加到 BlackBerry 上的另一个数据库附加数据库 http www sqlite org lang attach html命令 Database d1 d2 Statemen
  • 使用 XPath 获取属性

    给定一个像这样的 XML 结构
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • 使用Java开发跨平台,不同平台字体缩放不同

    我正在为我的大学制作一些软件 需要一个 GUI 在它的第一个版本中 我让它使用系统外观 因此它看起来像 Linux Mac Windows 中的本机应用程序 我发现这很麻烦 因为我必须根据操作系统使所有 JLabel 具有不同的大小 无论分
  • 在Java中多次读取System.in会导致IOException?

    我正在尝试创建一个小命令行游戏来强化我在过去几个月中在 Java 中学到的一些东西 我正在尝试创建一个名为 readInput 的方法 它返回一个我可以一次又一次调用的字符串 第一次它工作正常 但第二次它会导致 IO Exception 如
  • 如何使用云打印打印Android活动显示

    我正在尝试将 Google 云打印实现到应用程序中 遵循集成指南 https developers google com cloud print docs android 我试图通过打印 google com 来保持基本 单击我创建的打印按
  • 找不到符号assertEquals

    我正在尝试为计算器编写第一个单元测试 但 NetBeans 说它找不到该符号assertEquals和注释 Test 我应该包括一些东西吗 我正在使用 NetBeans 7 3 1 和 W7 package calculator impor
  • Selenium - 等待网络流量

    我们将 Selenium 与 Java API 和一些 Javascript 用户扩展一起使用 我们在应用程序中使用了大量 AJAX 调用 我们的许多测试随机失败 因为有时 AJAX 调用完成得比其他时候慢 因此页面未完全加载 我们通过等待
  • 我找不到 IntelliJ 快捷方式

    我使用 vim 一段时间 我知道有一个 intellij vim 插件 我很好奇内置的 IntelliJ 文本导航存在什么 如何打开实时模板来创建模板 如何查看以 tr 开头的现有模板列表 如何进行全局搜索并在当前文档中进行搜索 然后转到下

随机推荐

  • C++内存模型是否提供有关构造函数操作的保证[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 如何确保新构造的不可变对象可以在 C 线程之间安全共享 C 内存模型是否为构造函数的操作提供保证 当多个线程共享对某个对象的访问并且该对象被修改时 可能会出现竞争危险 这些问题可
  • IIS WCF 服务托管与 Windows 服务

    我们开发了一个 WCF 服务 并希望部署它 我们的客户将使用它basicHttpBinding但我们的内部团队将使用它namedPipesBinding 我们想知道将其托管在 IIS 7 中或使用 Windows 服务是否更好 我们运行了一
  • 无法安装 numpy - 需要 MS Visual C++ 14.1。但是已经安装了

    我在 Windows 10 上使用 pypy3 6 v7 3 0 我正在尝试安装 numpypip install numpy 但我不断收到错误 error Microsoft Visual C 14 1 is required Get i
  • 根据 Woocommerce 中的选定值显示或隐藏注册字段

    我正在尝试为我的网站定制注册表单 我一直在使用本指南 并已成功为我的注册表单创建 存储其他字段 定制注册指南 I have created a drop down select field in my registration form f
  • SQLite 中如果不存在则更改表添加列

    我们最近需要向一些现有的 SQLite 数据库表添加列 这可以通过以下方式完成ALTER TABLE ADD COLUMN 当然 如果表已经被更改 我们不想理会它 不幸的是 SQLite 不支持IF NOT EXISTS条款ALTER TA
  • 如何在Spring MVC中使用第三方WSDL服务

    我编写了一些服务 由 Android 应用程序使用 它接受请求并以 json 形式发送响应 现在我有一个场景 我必须通过提供的 WSDL 文件使用第三方 Web 服务 我不知道该怎么做 有人可以帮忙吗 这是我的dispatcher serv
  • Pipfile 和 Pipfile.lock 如何使用?

    看起来Pipfile Pipfile lock旨在替代requirements txt 在Python打包的上下 文中 然而 关于它们如何实际工作的文档并不多 我在 Python 网站的 PyPi 部分找到了 pipfile 的不断发展的描
  • Google App Engine 支持 Java 脚本引擎吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我想在 Google App Engine 运行时内动态评估 JavaScript 代码 Java有这个功能 但想知道GAE是否也支持这个功能 如果您能提供一个简单的代码将不胜感激
  • 自动将文件部署到 Amazon S3?

    我有一个 Rails 项目 我将把它部署到令人惊叹的地方Heroku 我真的希望能够自动将我的资源推送到 Amazon S3 本例中的资源是我的图像 样式表和 JavaScript 显然 我可以自己编写某种 capistrano 任务来执行
  • 使用 Swift 中其他视图中的视图输入的文本(Xcode 6)

    我对 Swift 和 Xcode 几乎完全陌生 所以请原谅我在这个领域缺乏知识 目前我有一个带有标签的视图控制器 我想在此之前添加一个视图 其中有一个文本字段 用户在其中输入名称 然后应用程序转到带有标签的第二个视图 其中用户输入的名称放置
  • Spring 中的 NoClassDefFoundError

    我编写了一个在 Weblogic 10 3 上运行的 Spring 应用程序 在此应用程序中 我有一些 JMS 队列使用者 有时 当应用程序关闭或打开时 我会收到错误消息 我在两种情况下都看到了此错误 java lang NoClassDe
  • 如何在 Google Colab 上安装 auto-sklearn?

    我想用自动学习 我使用了这个代码document 所有软件包均已安装 但我遇到了这样的错误 curl https raw githubusercontent com automl auto sklearn master requiremen
  • 并行流上的 Skip() 是否存在良好的用例?

    2015 年 9 月编辑 当我最初于 2015 年 2 月提出这个问题时 该行为在链接的问题虽然是违反直觉的kind of规范允许 尽管文档中存在一些小小的不一致 然而 Tagir Valeev 在 2015 年 6 月 提出了一个新问题
  • VBA Microsoft Word - 序列号

    我已经手动完成了此操作 我想将 ZXZ 的每个实例替换为从 1 一直到 Word 文档中最后一次出现的 ZXZ 的序列号 基本上 我想要实现的是在特定的Word文档中运行Word VBA宏 其中VBA宏从文件顶部开始搜索 查找每个出现的ZX
  • 点击后退按钮完成 UITextField 的编辑

    我的 NavigationController 中有 2 个控制器 首先将第二个推入堆栈 用户可以与那里的文本字段进行交互 然后 在一种情况下 用户将点击后退按钮以转到上一个屏幕 假设第二个实例的加载是 重 的 所以一旦需要 我将只保留它的
  • Python 中与密钥库的 https 握手

    我设置了一个 Web 服务器 该服务器拒绝没有有效 p12 证书的连接 我需要通过 Python 脚本访问在服务器上运行的 REST API 但我找不到有关如何执行此操作的任何信息 如果有人有关于如何在 Python 中使用 p12 证书执
  • 如何增加 VC9 (MSVC 2008) 中允许的修饰名称长度?

    我有一组相当大且复杂的程序要从 VC8 移植到 VC9 其中一个模块具有许多分层的 typedef 这会导致编译器生成 C4503 警告 修饰名被截断 生成的LIB文件将无法正确链接到项目中的其他模块 VC8 对此没有遇到任何问题 这让我得
  • Android - 是否可以通过编程方式获取安装引荐来源网址

    我注意到浏览器中的一些 Google Play 应用程序链接有referrer 它们的属性 这显然告诉了将您发送到 Google Play 中该应用程序页面的引荐来源网址 是否可以在我的应用程序代码中看到该引荐来源网址 如果有 如果没有 是
  • 通过蓝牙IPhone SDK发送字符串

    如何将字符串从 iPhone 发送到另一个设备 android pc 等 EDITED 以下代码用于通过蓝牙传输消息 视图控制器 h 文件 import
  • 使用 JAXB 编组/解组 Java 超类和子类

    我一直在尝试 JAXB 教程 并设法使代码能够从 Java 对象生成 XML 文件 然后能够使用 XML 生成 Java 对象 目前 它读取同一类的多个实例来创建一个类似于以下文件的 XML 文件