当前位置: 首页 > news >正文

使用JAXB将xml转成Java对象

文章目录

  • 使用JAXB将xml转成Java对象
  • 1. xml内容
  • 2. Java对象类
  • 3. 封装的工具类
  • 4. 测试

使用JAXB将xml转成Java对象

工作中遇到个问题,需要将xml转对象,之前复杂的xml都是自己用dom4j来解析组装成Java对象,但是对于简单的,看到了JAXB处理的这种方式,就整理下,写成个工具类。

1. xml内容

city.xml

<?xml version="1.0" encoding="UTF-8" ?>
<c c1="0"><a>10</a><b>20</b><d d1="101280101" d2="重庆" d3="nanping" d4="南坪"/><d d1="101280102" d2="重庆" d3="yubei" d4="渝北"/><d d1="101280103" d2="重庆" d3="dadukou" d4="大渡口"/>
</c>

2. Java对象类

  • CityList.xml
package com.stormkai.jaxb;import lombok.Data;
import javax.xml.bind.annotation.*;
import java.util.List;@Data
@XmlRootElement(name = "c")
@XmlAccessorType(XmlAccessType.FIELD)
public class CityList {@XmlAttribute(name = "c1")private String c1;@XmlElement(name = "a")private String a;@XmlElement(name = "b")private String b;@XmlElement(name = "d")private List<City> cityList;
}
  • City.java
package com.stormkai.jaxb;import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;@Data
@XmlRootElement(name = "d")
@XmlAccessorType(XmlAccessType.FIELD)
public class City {@XmlAttribute(name = "d1")private String cityId;@XmlAttribute(name = "d2")private String cityName;@XmlAttribute(name = "d3")private String cityNode;@XmlAttribute(name = "d4")private String area;
}

JAXBContext类,是应用的入口,用于管理XML/Java绑定信息
Unmarshaller接口,将XML数据反序列化为Java对象
@XmlType,将Java类或枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化

  • PUBLIC_MEMBER :默认值,public权限亦或是具有get/set方法属性
  • FIELD:对象中的所有属性
  • PROPERT:对象中所有具备get/set方法的属性
  • NONE:对象的所有属性都不映射

@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)
@XmlRootElement,将Java类或枚举类型映射到XML元素
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性

3. 封装的工具类

XmlBuilder.java

package com.stormkai.jaxb;import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.Reader;
import java.io.StringReader;public class XmlBuilder {public static <T> T xmlToObj4Jaxb(Class<?> clazz, String xml){try {T xmlObject;Reader reader;JAXBContext context = JAXBContext.newInstance(clazz);Unmarshaller unmarshaller = context.createUnmarshaller();reader = new StringReader(xml);xmlObject = (T)unmarshaller.unmarshal(reader);reader.close();return xmlObject;} catch (Exception e) {e.printStackTrace();}return null;}
}

4. 测试


public class XmlBuilder {public static <T> T xmlToObj4Jaxb(Class<?> clazz, String xml){try {T xmlObject;Reader reader;JAXBContext context = JAXBContext.newInstance(clazz);Unmarshaller unmarshaller = context.createUnmarshaller();reader = new StringReader(xml);xmlObject = (T)unmarshaller.unmarshal(reader);reader.close();return xmlObject;} catch (Exception e) {e.printStackTrace();}return null;}public String getCityXml1(){String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +"<c c1=\"0\">\n" +"    <a>10</a>\n" +"    <b>20</b>\n" +"    <d d1=\"101280101\" d2=\"重庆\" d3=\"nanping\" d4=\"南坪\"/>\n" +"    <d d1=\"101280102\" d2=\"重庆\" d3=\"yubei\" d4=\"渝北\"/>\n" +"    <d d1=\"101280103\" d2=\"重庆\" d3=\"dadukou\" d4=\"大渡口\"/>\n" +"</c>";return xml;}public static void main(String[] args) {String xml = new XmlBuilder().getCityXml1();CityList cityList = xmlToObj4Jaxb(CityList.class, xml);System.out.println(JSON.toJSONString(cityList));}
}

输出结果:

{"a":"10","b":"20","c1":"0","cityList":[{"area":"南坪","cityId":"101280101","cityName":"重庆","cityNode":"nanping"},{"area":"渝北","cityId":"101280102","cityName":"重庆","cityNode":"yubei"},{"area":"大渡口","cityId":"101280103","cityName":"重庆","cityNode":"dadukou"}]}Process finished with exit code 0

输出的json格式化后:

{"a": "10","b": "20","c1": "0","cityList": [{"area": "南坪","cityId": "101280101","cityName": "重庆","cityNode": "nanping"}, {"area": "渝北","cityId": "101280102","cityName": "重庆","cityNode": "yubei"}, {"area": "大渡口","cityId": "101280103","cityName": "重庆","cityNode": "dadukou"}]
}
http://www.lryc.cn/news/175605.html

相关文章:

  • 第6讲:v-for使用
  • ubuntu http 服务器响应
  • C语言 结构体位域
  • ChatGPT AIGC 非常实用的AI工具集合大全
  • Visual Studio Cpp CLR C# 替换
  • typeorm利用mongodb,save的时候更新会出现重复数据的问题。
  • 决策树案例分析
  • Linux基本操作符(1)
  • pg数据表同步到hive表数据压缩总结
  • 2023-Chrome插件推荐
  • VUE使用DXFParser组件解析dxf文件生成图片
  • SpringBoot 集成 AKKA
  • 什么是Service Worker?它在PWA中的作用是什么?
  • 【算法深入浅出】字符串匹配之 KMP 算法
  • 放弃webstrom转战vscode
  • VSCode 和 CLion
  • Learn Prompt- Midjourney Prompt:Prompt 提示语
  • uvm白皮书练习_ch2_ch223_加入objection机制
  • 利用C++开发一个迷你的英文单词录入和测试小程序-增强功能
  • kibana启动报错
  • 排查内存泄露
  • 【LeetCode-简单题】501. 二叉搜索树中的众数
  • MAC word 如何并列排列两张图片
  • PTA第三章作业题
  • vscode vue html 快捷键
  • mysql锁相关的总结
  • 计算机竞赛 深度学习乳腺癌分类
  • docker-compose搭建的mysql,如何定时备份数据
  • webpack:关于处理html文件的插件html-webpack-plugin、add-asset-html-webpack-plugin
  • 如何两个不同的脚本文件之间传递参数