JAVA将xml数据转为实体类

news2024/11/25 20:36:33

使用 JAXB(Java Architecture for XML Binding) 实现XML与Bean的相互转换

介绍

JAXB是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。
Jaxb 2.0是JDK 1.6的组成部分。我们不需要下载第三方jar包 即可做到轻松转换。Jaxb2使用了JDK的新特性,如:Annotation、GenericType等,需要在即将转换的JavaBean中添加annotation注解。

常用注解

@XmlRootElement
标识这个类或枚举类型是根元素,映射到 XML 元素中。JAXB 中的注解, 作用在类上。

@XmlElement
将java对象的属性映射为xml的节点。将没有get方法/set方法的属性映射到XML,作用在字段或方法。

@XmlAttribute
將 java 对象的属性映射为 xml 的节点的属性。

@XmlAccessorType
可能值:
FIELD: 绑定类中的(每个,没有get方法/set方法的属性也可以)非静态、非瞬态字段将会自动绑定映射到 XML,除非由 XmlTransient 注释。

NONE: 所有字段或属性都不能绑定到 XML,除非使用一些 JAXB 注释专门对它们进行注释。

PROPERTY: 绑定类中的(每个,只有有get方法/set方法的属性才可以)自动绑定映射到 XML,除非由 XmlTransient 注释。

PUBLIC_MEMBER:每个公共获取方法/设置方法对和每个公共字段将会自动绑定到 XML,除非由 XmlTransient 注释。

@XmlTransient(非瞬态)
用于标示在由Java对象映射XML时,忽略此属性,在生成的XML文件中将不出现此元素。

例子

xml内容

在这里插入图片描述

实体映射

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

xml工具类

public class JAXBUtil {

    /**
     * XML转换为POJO类型
     */
    @SuppressWarnings("rawtypes")
    public static Object unmarshall(String xml, Class clsToUnbound) throws JAXBException, UnsupportedEncodingException {
        JAXBContext jc = JAXBContext.newInstance(clsToUnbound);

        return unmarshall(jc, xml);
    }

    private static Object unmarshall(JAXBContext jc, String xml) throws JAXBException, UnsupportedEncodingException {
        Unmarshaller u = jc.createUnmarshaller();
        InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
        return u.unmarshal(is);
    }

    /**
     * 从流中反序列化对象。
     *
     * @param cls   需要反序列化的对象类型。
     * @param xmlIs 流对象
     * @return 经过反序列化的对象实例。
     * @throws JAXBException
     */
    public static Object unmarshall(InputStream xmlIs, Class<?> cls) throws JAXBException {
        JAXBContext jc = JAXBContext.newInstance(cls);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Object obj = unmarshaller.unmarshal(xmlIs);
        return obj;
    }

    @SuppressWarnings("unchecked")
    public Object unmarshall(String xml, Class<? extends Object>... classes) throws JAXBException, IOException {
        InputStream is = new ByteArrayInputStream(xml.getBytes());
        JAXBContext jc = JAXBContext.newInstance(classes);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.setProperty(Marshaller.JAXB_ENCODING, "utf-8");
        Object obj = unmarshaller.unmarshal(is);
        return obj;
    }

    /**
     * POJO类型转换为XML
     *
     * @param jc
     * @param serObj
     * @param formatOutput 是否格式化
     * @param fragment     是否隐藏报文头
     * @return
     * @throws JAXBException
     * @throws PropertyException
     */
    private static String marshall(JAXBContext jc, Object serObj, boolean formatOutput, boolean fragment) throws JAXBException, PropertyException {
        StringWriter out = new StringWriter();
        Marshaller m = jc.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, formatOutput);
        m.setProperty(Marshaller.JAXB_FRAGMENT, fragment);
        m.setProperty(Marshaller.JAXB_ENCODING, "utf-8");
        m.marshal(serObj, out);
        String tmp = out.toString();
        return tmp;
    }

    @SuppressWarnings("rawtypes")
    public static String marshall(Object serObj, Class clsToBound) throws JAXBException {
        JAXBContext jc = JAXBContext.newInstance(clsToBound);
        return marshall(jc, serObj, true, false);
    }

    public static String marshall(Object serObj, boolean formatOutput, boolean fragment) throws JAXBException {
        JAXBContext jc = JAXBContext.newInstance(serObj.getClass());
        return marshall(jc, serObj, formatOutput, fragment);
    }

    public static String marshall(Object serObj, boolean formatOutput) throws JAXBException {
        return marshall(serObj, formatOutput, false);
    }

    /**
     * 将类序列化到流中。
     *
     * @param contextPath 需要序列化到类名
     * @param obj         需要序列化的实例对象
     * @param stream      需要序列化到的流对象。
     * @throws JAXBException
     */
    public static void marshall(String contextPath, Object obj, OutputStream stream) throws JAXBException {
        JAXBContext jc = JAXBContext.newInstance(contextPath);
        Marshaller m = jc.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        m.marshal(obj, stream);
    }
}

测试代码

在这里插入图片描述

结果

bean = Forecast_Content(PubListName=南海海域预报, seaAreas=[SeaArea(items=[Item(NameCHS=狮子洋海域, NameEN=shizi sea, forecastContentList=[ForecastContent(time=2320:00, WaveHeightStr=0.1-0.3)]), Item(NameCHS=内伶仃洋海域, NameEN=lingding sea, forecastContentList=[ForecastContent(time=2320:00, WaveHeightStr=0.2-0.6)]), Item(NameCHS=中华白海豚保护区, NameEN=, forecastContentList=[ForecastContent(time=2320:00, WaveHeightStr=0.3-0.7)]), Item(NameCHS=外伶仃洋海域, NameEN=outer lingding sea, forecastContentList=[ForecastContent(time=2320:00, WaveHeightStr=0.5-0.8)]), Item(NameCHS=桂山岛海域, NameEN=guishan, forecastContentList=[ForecastContent(time=2320:00, WaveHeightStr=0.7-1.0)])])])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/559508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年7大人工智能技术趋势你有了解过嘛

人工智能 (AI) 已经接管世界&#xff0c;并且将在2023年继续向前发展。在2023年&#xff0c;它将完全实现自动化供应链、虚拟助手等多个产品与形态。 如今&#xff0c;世界正在经历一波人工智能驱动的全球经济转型浪潮。 当前之态势&#xff0c;人工智能 (AI) 技术几乎在每个领…

如何用Python进行屏幕录制?

文章目录 引言gpt3.5给出的代码更换截图函数——ImageGrab.grab禁用imshow解决递归现象摄像头录制代码后期需求 引言 关于屏幕录制这个功能需求&#xff0c;之前用过基于ffmpeg的Capture录屏软件&#xff0c;但是fps拉高以后会变得很卡&#xff0c;声音也同样出现卡顿。也自己…

cpu 内核 逻辑处理器的关系

6核CPU&#xff0c;12个逻辑处理器 一颗内核在一个时间片内只能执行一个内核线程&#xff1b;当物理CPU使用了超线程技术后&#xff0c;在CPU的一颗内核中&#xff0c;利用就是利用其中空闲的执行单元&#xff0c;模拟出另外一个核心&#xff08;并不是真正的物理运算核心&…

公司招人,面了一个5年经验不会自动化的测试人,他凭什么要18K?

在深圳这家金融公司也待了几年&#xff0c;被别人面试过也面试过别人&#xff0c;大大小小的事情也见识不少&#xff0c;今天又是团面的一天&#xff0c; 一百多个人都聚集在一起&#xff0c;因为公司最近在谈项目出来面试就2个人&#xff0c;无奈又被叫到面试房间。 整个过程…

【算法训练(day5)】前缀和与差分

目录 一.一维前缀 二.二维前缀和 三.一维差分 四.二维差分 一.一维前缀 1.前缀的作用 前缀用于在求一部分区间的和&#xff0c;比方说有一组数据a1,a2,a3,a4,我们想知道从第一个元素一直相加到最后一个元素的和或者是从第二个元素加到第三个元素&#xff0c;这种情况下就能…

docker部署elasticsearch:8.6.2, kibana,logstash 版本以及kibana的使用

文章目录 1、参考2、安装elasticsearch:8.6.22.1 创建网络2.2 创建无密码访问的elasticsearch服务2.3 访问验证2.4 建一个索引试试&#xff0c;此索引名为my-book&#xff0c;有六个字段2.5 用GET命令获取索引信息试试&#xff0c;如下&#xff0c;符合预期2.6 再试试批量导入一…

redis集群的架构、问题,附脑洞

本文首发自「慕课网」&#xff08;www.imooc.com&#xff09;&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"或慕课网公众号&#xff01; 作者&#xff1a;一凡 | 慕课网讲师 Redis 是一种开源&#xff08;BSD 许可&…

魔术表演-第14届蓝桥杯省赛Scratch中级组真题第1题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第136讲。 魔术表演&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组真题第1题&#xf…

【arxiv】论文找 idea : 关于 OVD 的论文扫读(四)

文章目录 一、DetCLIPv2: Scalable Open-Vocabulary Object Detection Pre-training via Word-Region Alignment二、Prompt-Guided Transformers for End-to-End Open-Vocabulary Object Detection三、Bridging the Gap between Object and Image-level Representations for Op…

2023年京东618预售数据免费开放(往年618热门品类数据回顾)

2023年618京东平台整体的活动节奏分为五个时期&#xff1a; 第一时期为预售期&#xff1a;2023年5月23日晚8点-5月31日 第二时期为开门红&#xff1a;5月31日20点-6月3日 第三时期为场景期&#xff1a;6月4日-6月15日 第四时期为高潮期&#xff1a;6月15日20点-6月18日 第五…

前端HTML之基础扫盲

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 本篇文章将讲解HTML的基础&#xff0c;认识HTML的基本结构&#xff0c;学会使用常用的HTML标签&#xff0c;愿诸位喜欢 目录 文章目录 一、创建第一个HTML程序 二、HTML基本标签介绍 2.1 HT…

AAAI2024 The Thirty-Eighth Conference on Artificial Intelligence

Past Conferences For information about past AAAI Conferences, please consult the following pages. https://aaai.org/conference/aaai/ Future Conferences https://aaai.org/aaai-conference/ 2024 年 2 月在加拿大温哥华举行的第 38 届 AAAI 人工智能年度会议 The…

Linkage Mapper 中 Climate Linkage Mapper功能解析(含实例分析)

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 Climate Linkage Mapper的输出结果,应用于华盛顿州和英属哥伦比亚省之间跨境地区的白松树效果图 图片来源地址 文

解决weekofyear跨年问题

目录 前言跨年问题计算当年第几周前言 前段时间,做了一个日期维度表的需求,发现 计算当年第几周 有误,发现 Hive 中 weekofyear 函数存在跨年问题! 跨年问题 这一周算上一年还是下一年,取决于这一周的大多数日期(4天及以上)在哪一年。算在前一年,就是前一年的最后一…

K8s in Action 阅读笔记——【1】Introducing Kubernetes

K8s in Action 阅读笔记——【1】Introducing Kubernetes 多年前&#xff0c;大多数软件应用程序都是庞大的单体应用&#xff0c;运行在单个进程或少量进程分布在几台服务器上。这些传统系统今天仍然广泛存在。它们具有缓慢的发布周期&#xff0c;更新相对不频繁。在每个发布周…

【软考数据库案例分析】(全)

目录 1.1 案例分析概述 1.2 数据流图设计 1.3 概念结构设计 1.4 关系模式设计 1.5 SQL语言设计 1.5.1 创建表(create table) 1.5.2 修改表 (alter table) 1.5.3 删除表 (drop table) 1.5.4 索引 1.5.5 视图 1.5.6 查询语句格式 1.6.7 分组查询 1.5.8 其他操作 1.5…

图书系统小练习

1.对于任何系统&#xff0c;我们最先想到的就是普通用户和管理员&#xff0c;所以我们第一件事情就是创建一个包&#xff0c;里面包含 管理员 Admin&#xff08;继承User&#xff09; 普通用户 NormalUser(继承User) abstract类的 User 2.然后就是我们的菜单了 我们将管…

“云端”医学馆 | 平行云助力拜科打造医疗虚仿新模式

“云端”医学馆——拜科医疗虚仿新体验 当前&#xff0c;各个行业都正经历着一场深刻的数字化变革&#xff0c;医疗领域也没有例外&#xff0c;很多医疗厂商都在积极拥抱数字化技术的融入与应用。拜科数字生物科技&#xff08;中国&#xff09;有限公司正是医疗虚仿潮流中的领…

数字图像处理 使用C#进行图像处理八 Unsharp Masking

一、Unsharp Masking简述 Unsharp Masking是一种线性图像处理技术,用于锐化图像。清晰的细节被识别为两者之间的差异原始图像及其模糊版本。然后缩放这些细节, 并添加回原始图像: 增强图像 = 原始图像 + 数量 *(原始图像 - 模糊) 模糊步骤可以使用任何图像滤波方法,例如…

AI绘画设计师专用单词表;游戏业AI正在疯抢工作;使用AI工具翻译整本英文书;用GPT-4搞定调研报告 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『如果是皮克斯制作了哈利波特系列』又萌又暖还可爱&#xff0c;想 rua&#xff01;&#xff01; 皮克斯是美国顶级的电脑动画制作公司…