Xml Entity 实体互转(JAXB)
感觉比 xStream 操作起来复杂些 Xml Entity 实体互转(XStream)。但学习成本低些,不需要引用第三方依赖包
需要注意的是 实体中如果加了 getXX 需要在上面加上 @XmlTransient 否则会报“类的两个属性具有相同的名称
Intellij idea getter setter 模板设置
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.io.Serializable;
import java.util.Date; /**
* 患者基本信息
*/
@XmlRootElement(name="PatientInfo")//表示根元素
public class PatientInfoVo implements Serializable { /**
* 患者ID 没加 @XmlElement 不会生成 xml
*/
private String patientId; /**
* 患者信息
*/
@XmlElement(name = "PAT_NAME")
private String patientName; /**
* 患者性别
*/
@XmlElement(name = "PatientGender")
private Boolean gender; /**
* 出生日期
*/
@XmlElement(name = "DATE_BIRTH")
@XmlJavaTypeAdapter(DateXmlAdapter.class)
private Date patientBirthdate; /**
*
*/
@XmlElement(name = "MedicalType")
private Integer medicalType; public String getPatientId() {
return patientId;
} public void setPatientId(String patientId) {
this.patientId = patientId;
} @XmlTransient
public String getPatientName() {
return patientName;
} public void setPatientName(String patientName) {
this.patientName = patientName;
} @XmlTransient
public Boolean getGender() {
return gender;
} public void setGender(Boolean gender) {
this.gender = gender;
} @XmlTransient
public Date getPatientBirthdate() {
return patientBirthdate;
} public void setPatientBirthdate(Date patientBirthdate) {
this.patientBirthdate = patientBirthdate;
} @XmlTransient
public Integer getMedicalType() {
return medicalType;
} public void setMedicalType(Integer medicalType) {
this.medicalType = medicalType;
} @Override
public String toString() {
return "PatientInfoVo{" +
"patientId='" + patientId + '\'' +
", patientName='" + patientName + '\'' +
", gender=" + gender +
", patientBirthdate=" + patientBirthdate +
", medicalType=" + medicalType +
'}';
} }
DateXmlAdapter
import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.text.SimpleDateFormat;
import java.util.Date; /**
* 日期格式化
*/
public class DateXmlAdapter extends XmlAdapter<String, Date> {
private final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override
public Date unmarshal(String date) throws Exception {
return SDF.parse(date);
} @Override
public String marshal(Date date) throws Exception {
return SDF.format(date);
}
}
Test.java
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest; import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Date; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class XmlTests {
Logger logger = LoggerFactory.getLogger(this.getClass()); /**
* 玩得不熟,没有拼字符串来得直接
*/
@Test
void entityToxmlTest() {
PatientInfoVo info = new PatientInfoVo();
info.setPatientId("这个没添加注解");
info.setPatientName("张三");
info.setGender(false);
info.setMedicalType(1); //TODO 待转成应对的汉字
info.setPatientBirthdate(new Date()); StringWriter sw = new StringWriter();
try {
//根据Person类生成上下文对象
JAXBContext jc = JAXBContext.newInstance(PatientInfoVo.class);
//从上下文中获取Marshaller对象,用作将bean编组(转换)为xml
Marshaller ma = jc.createMarshaller();
//以下是为生成xml做的一些配置
//格式化输出,即按标签自动换行,否则就是一行输出
ma.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//设置编码(默认编码就是utf-8)
ma.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
//是否省略xml头信息,默认不省略(false)
ma.setProperty(Marshaller.JAXB_FRAGMENT, true);
//编组
ma.marshal(info, sw);
} catch (JAXBException e) {
e.printStackTrace();
}
logger.info("\r\n" + sw.toString());
} /**
* 反转还行,挺方便,复杂的结构可以参考一些其它资料
*/
@Test
void xmlToEntityTest() throws JAXBException {
String xml = "<PatientInfo>\n" +
" <PAT_NAME>张三</PAT_NAME>\n" +
" <PatientGender>false</PatientGender>\n" +
" <DATE_BIRTH>2021-10-22 12:39:20</DATE_BIRTH>\n" +
" <MedicalType>1</MedicalType>\n" +
"</PatientInfo>\n";
JAXBContext jc = JAXBContext.newInstance(PatientInfoVo.class);
//从上下文中获取Marshaller对象,用作将bean编组(转换)为xml
Unmarshaller unmarshaller = jc.createUnmarshaller();
PatientInfoVo user = (PatientInfoVo) unmarshaller.unmarshal(new StringReader(xml));
logger.info(user.toString());
}
}
Xml Entity 实体互转(JAXB)的更多相关文章
- JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法
在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,远哥目前找到了2种方法. 这2种方式都可以实现不用persist ...
- XXE(XML External Entity attack)XML外部实体注入攻击
导语 XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击.由于程序在解析输入的XML数据时,解析了攻击者 ...
- C#.NET XML 与 实体 MODEL 互转,非序列化
只能处理简单结构XML 和 实体. using System.Text; using System.Xml; namespace A.Util { public static class MyXmlU ...
- XML 和 List 互转类
XML 和 List 互转类 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- 简单两步快速学会使用Mybatis-Generator自动生成entity实体、dao接口和简单mapper映射(用mysql和oracle举例)
前言: mybatis-generator是根据配置文件中我们配置的数据库连接参数自动连接到数据库并根据对应的数据库表自动的生成与之对应mapper映射(比如增删改查,选择性增删改查等等简单语句)文件 ...
- Json、JavaBean、Map、XML之间的互转
思路是JavaBean.Map.XML都可以用工具类很简单的转换为Json,进而实现互相转换 1.Map.XML与Json互转 mvn依赖 <dependency> <groupId ...
- XML外部实体注入漏洞(XXE)
转自腾讯安全应急响应中心 一.XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声 ...
- 微信支付的JAVA SDK存在漏洞,可导致商家服务器被入侵(绕过支付)XML外部实体注入防护
XML外部实体注入 例: InputStream is = Test01.class.getClassLoader().getResourceAsStream("evil.xml" ...
- XML与 实体的相互转化
using System; using System.Linq; using System.Xml; using System.Reflection; using System.Data; using ...
- 【代码审计】CLTPHP_v5.5.3前台XML外部实体注入漏洞分析
0x01 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chichu/ ...
随机推荐
- STM32CUBEIDE 如何将变量定义到指定内存地址
使用场景如下: 我需要将bootloader/APP的版本号和一些字段信息定义到指定FLASH地址. 在STM32CubeIDE中的方法: 截止当前STM32CubeIDE还没有提供图形化的针对FLA ...
- L2-039 清点代码库
#include <bits/stdc++.h> using namespace std; const int N = 10010, M = 110; int main() { int n ...
- React 中事件处理
不要问自己需要什么样的人生,而要问自己想要成为什么样的人. 我们从前面的学习知道一个 React 组件不仅仅只包含 DOM 结构的,还应该样式和 Javascript 逻辑的.这里我们认识逻辑构造之事 ...
- MYSQL EXPLAIN 执行计划
EXPLAIN 执行计划 有了慢查询语句后,就要对语句进行分析.一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方 ...
- [ABC237G] Range Sort Query
Problem Statement Given is a permutation $P=(P_1,P_2,\ldots,P_N)$ of $1,2,\ldots,N$, and an integer ...
- jenkins安装部署、主从架构、slave镜像、K8S对接
介绍 CI/CD工具,自动化持续集成和持续部署,用于构建各种自动化任务. 官方提供了docker镜像https://hub.docker.com/r/jenkins/jenkins 使用Deploym ...
- 神经网络优化篇:如何理解 dropout(Understanding Dropout)
理解 dropout Dropout可以随机删除网络中的神经单元,为什么可以通过正则化发挥如此大的作用呢? 直观上理解:不要依赖于任何一个特征,因为该单元的输入可能随时被清除,因此该单元通过这种方式传 ...
- 文心一言 VS 讯飞星火 VS chatgpt (166)-- 算法导论13.1 6题
六.用go语言,在一棵黑高为 k 的红黑树中,内部结点最多可能有多少个?最少可能有多少个? 文心一言: 红黑树是一种自平衡的二叉查找树,其中每个节点都有一个颜色属性,可以是红色或黑色.红黑树满足以下性 ...
- 牛客刷Java记录第6天
第一题 一个文件中的字符要写到另一个文件中,首先需要( ). A System.out.print (buffer[i]); B FileOutputStream fout = new FileOut ...
- 云MSP技本功|redis的5种对象与8种数据结构之字符串对象(下)
简介: 引言 本文是对<redis设计与实现(第二版)>中数据结构与对象相关内容的整理与说明.本篇文章只对对象结构,1种对象--字符串对象.以及字符串对象所对应的两种编码--raw和emb ...