最近需要做一个接收xml字符串,转化为java对象并录入数据库功能

说一下我的业务,
我是先从rabbitmq中拿到固定格式的字符串形式的xml,且目标数据是在某一个标签中,是一串base64加密的字符串,转换后是对应的字符串形式的xml
所以我需要先将字符串转换为xml对象获取对应的节点(也可以通过java字符串查找截取,但可能比较费事)并再次字符串转换为xml对象,再将xml对象转换为java对象存到数据库中。

引入依赖

<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1</version></dependency><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId></dependency>

难点,我的最终xml解析出来 对应的标签比较混乱
准备一个测试xml

<rootEle><title>我是菜鸟</title><sites><site><name>RUNOOB</name><url>www.runoob.com</url></site><site><name>Google</name><url>www.google.com</url></site><site><name>Facebook</name><url>www.facebook.com</url></site></sites><user><name>RUNOOB</name><url>www.runoob.com</url></user><user><name>RUNOOB</name><url>www.runoob.com</url></user><singleEle><name>RUNOOB</name><url>www.runoob.com</url></singleEle>
</rootEle>

这个xml代表了转换时候遇到的几种情况
1 多条用一个总标签给包起来的(sites -> site)
2 多个标签就直接出现在xml中 (user)
3 直接就是唯一的标签(这种最简单直接转换 singleEle)

JAXB 用对象给转换xml对象时,是按照标签层级来一步一步对照的,比如这个sites标签内的site怎么转换成list呢,我们可以多创建一个java对象来对应,这个java对象的根目录注解就是sites 创建这个sites对象,这个对象里面再如法炮制创建list对象

对于第二个直接在我们创建的xml根目录类上面定义list

单独bena 直接 定义单独对象好了

上图

再来看一下sites
再看一下 site

对应的话大致就是这样,这里说一句@XmlRootElement 一定要按层级一级一级来,一个类一个这个注解对应一层标签,另外@XmlAccessorType 这个注解也不可少,表明是文件类型,不然会报错,报错还有一种方案是在get方法上加注解,一时忘了是啥注解,你可以百度一下,好了例子举证完,看一下我的项目结构就上代码了

entity 里面是对应的注解文件
tools 是解析文件
调用在test文件 因为main执行就可以没有走接口

好了上代码
entity 代码

package com.example.demo.entity;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.XmlRootElement;@XmlRootElement(name = "rootEle")
@XmlAccessorType(XmlAccessType.FIELD)
public class XmlTest {@XmlElement(name = "sites")private Sites sites;@XmlElement(name = "user")private List<User> users;@XmlElement(name = "singleEle")private SingleEle singleEle;/*** @return the singleEle*/public SingleEle getSingleEle() {return singleEle;}/*** @param singleEle the singleEle to set*/public void setSingleEle(SingleEle singleEle) {this.singleEle = singleEle;}/*** @return the sites*/public Sites getSites() {return sites;}/*** @param sites the sites to set*/public void setSites(Sites sites) {this.sites = sites;}/*** @return the users*/public List<User> getUsers() {return users;}/*** @param users the users to set*/public void setUsers(List<User> users) {this.users = users;}/*** @return* @see java.lang.Object#toString()*/@Overridepublic String toString() {return "Test [sites=" + sites + ", users=" + users + ", singleEle=" + singleEle + "]";}}
package com.example.demo.entity;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.XmlRootElement;@XmlRootElement(name = "sites")
@XmlAccessorType(XmlAccessType.FIELD)
public class Sites {@XmlElement(name = "site")private List<Site> sites;/*** @return* @see java.lang.Object#toString()*/@Overridepublic String toString() {return "Sites [sites=" + sites + "]";}/*** @return the sites*/public List<Site> getSites() {return sites;}/*** @param sites the sites to set*/public void setSites(List<Site> sites) {this.sites = sites;}}
package com.example.demo.entity;import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name = "site")
@XmlAccessorType(XmlAccessType.FIELD)
public class Site {@XmlElement(name = "name")private String name;@XmlElement(name = "url")private String url;/*** @return the name*/public String getName() {return name;}/*** @param name the name to set*/public void setName(String name) {this.name = name;}/*** @return the url*/public String getUrl() {return url;}/*** @param url the url to set*/public void setUrl(String url) {this.url = url;}/*** @return* @see java.lang.Object#toString()*/@Overridepublic String toString() {return "Site [name=" + name + ", url=" + url + "]";}}
package com.example.demo.entity;import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {@XmlElement(name = "name")private String name;@XmlElement(name = "url")private String url;/*** @return* @see java.lang.Object#toString()*/@Overridepublic String toString() {return "User [name=" + name + ", url=" + url + "]";}/*** @return the name*/public String getName() {return name;}/*** @param name the name to set*/public void setName(String name) {this.name = name;}/*** @return the url*/public String getUrl() {return url;}/*** @param url the url to set*/public void setUrl(String url) {this.url = url;}}
package com.example.demo.entity;import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name = "singleEle")
@XmlAccessorType(XmlAccessType.FIELD)
public class SingleEle {@XmlElement(name = "name")private String name;@XmlElement(name = "url")private String url;/*** @return the name*/public String getName() {return name;}/*** @param name the name to set*/public void setName(String name) {this.name = name;}/*** @return the url*/public String getUrl() {return url;}/*** @param url the url to set*/public void setUrl(String url) {this.url = url;}/*** @return* @see java.lang.Object#toString()*/@Overridepublic String toString() {return "Site [name=" + name + ", url=" + url + "]";}}

tools代码

package com.example.demo.tools;import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import java.io.StringReader;
import java.io.StringWriter;public class XmlUtils {/*** bean转成xml* @param t :* @return string*/public static <T> String beanToXml(T t){try {JAXBContext context = JAXBContext.newInstance(t.getClass());Marshaller m = context.createMarshaller();StringWriter sw = new StringWriter();m.marshal(t,sw);return sw.toString();} catch (JAXBException e) {e.printStackTrace();}return "";}/*** bean转成xml(泛型使用)* @param t :* @return java.lang.String*/public static <T> String beanToXml(T t, Class c) {try {JAXBContext context = JAXBContext.newInstance(t.getClass(),c);Marshaller m = context.createMarshaller();StringWriter sw = new StringWriter();m.marshal(t,sw);return sw.toString();} catch (JAXBException e) {e.printStackTrace();}return "";}/*** xml 转成 bean* @param xml :* @param t :* @return T*/public static <T> T xmlToBean(String xml, T t) {try {JAXBContext context = JAXBContext.newInstance(t.getClass());Unmarshaller um = context.createUnmarshaller();StringReader sr = new StringReader(xml);t = (T) um.unmarshal(sr);return t;} catch (JAXBException e) {e.printStackTrace();}return null;}/*** xml 转成 bean(泛型使用)* @param t, t* @param xml xml* @param c t]* @return T*/public static <T> T xmlToBean(String xml, T t, Class c){try {JAXBContext context = JAXBContext.newInstance(t.getClass(),c);Unmarshaller um = context.createUnmarshaller();StringReader sr = new StringReader(xml);t = (T) um.unmarshal(sr);return t;} catch (JAXBException e) {e.printStackTrace();}return null;}}

接下来是调用代码

package com.example.demo;import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.w3c.dom.Document;import com.example.demo.entity.XmlTest;
import com.example.demo.tools.XmlUtils;@SpringBootTest
class DemoApplicationTests {@Testvoid contextLoads() {}public static void main(String[] args) {String xml = "<rootEle><title>我是菜鸟</title><sites><site><name>RUNOOB</name><url>www.runoob.com</url></site><site><name>Google</name><url>www.google.com</url></site><site><name>Facebook</name><url>www.facebook.com</url></site></sites><user><name>RUNOOB</name><url>www.runoob.com</url></user><user><name>RUNOOB</name><url>www.runoob.com</url></user><singleEle><name>RUNOOB</name><url>www.runoob.com</url></singleEle></rootEle>";XmlTest test = new XmlTest();Document doc = StringToXml(xml);if (doc == null) {//异常数据处理} String nodePath = "rootEle/title";String nodeValue = getNodeValue(doc, nodePath);if("".equals(nodeValue)) {//异常数据处理}test = XmlUtils.xmlToBean(xml, test,XmlTest.class);System.out.println("xml转成bean格式为:\n" + test);}/**** @param xml形状的str串* @return Document 对象*/public static Document StringToXml(String str) {StringBuilder sXML = new StringBuilder();sXML.append(str);DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();Document doc = null;InputStream is = null;try {is = new ByteArrayInputStream(sXML.toString().getBytes("utf-8"));doc = dbf.newDocumentBuilder().parse(is); } catch (Exception e) {e.printStackTrace();} finally {//关闭输入流if (is != null)try {is.close();} catch (IOException e) {e.printStackTrace();}  }return doc;}/**** @param xml的document 和string 路径* @return String 目标节点的字符串值*/public static String getNodeValue(Document document, String nodePaht) {XPathFactory xpfactory = XPathFactory.newInstance();XPath path = xpfactory.newXPath();String servInitrBrch = "";try {servInitrBrch = path.evaluate(nodePaht, document);} catch (XPathExpressionException e) {e.printStackTrace();}return servInitrBrch;}}

代码完毕,看一下我的执行

到此结束,可能有点长,但我遇到的问题点都分享了,欢迎指正,谢谢。

JAXB实现xml到bean录入数据库相关推荐

  1. Java+MyEclipse+Tomcat (五)DAO和Java Bean实现数据库和界面分开操作

    正如前面一篇文章的介绍,当使用Servlet提交表单和JSP数据库查询时,总是相互交叉着的处理,要么在JSP中通过<%...%>内嵌Java代码操作数据库,要么 JSP中通过Post方法提 ...

  2. 使用JAXB将XML Schema绑定到Java类

    http://blog.csdn.net/zsyspace/article/details/1786079 Java Architecture for XML Binding (JAXB) 是一项可以 ...

  3. Spring Ioc容器,基于xml的bean管理

    IOC容器 IOC思想基于IOC容器,IOC容器底层就是对象工厂 IOC底层 通过控制反转,使用xml配置文件和反射机制实现对对象的创建 IOC接口 实现IOC容器的两种方式 (1)BeanFacto ...

  4. jaxb java_JAXB xml与javaBean的转换

    转自:https://blog.csdn.net/lydong_/article/details/79812626 `1. 1.不认识到犯错,然后得到永久的教训. 也不是所谓的教训吧,真正的教训来自于 ...

  5. @ImportResource-SpringBoot使用xml配置Bean

    #前言 SpringBoot推荐使用注解的方式去声明bean,但还是提供了xml的方式去加载bean #一.创建要声明为bean的实体类 WzqEntity.java package com;/** ...

  6. @ImportResource SpringBoot使用xml配置Bean

    前言 SpringBoot推荐使用注解的方式去声明bean,但还是提供了xml的方式去加载bean 一.创建要声明为bean的实体类 WzqEntity.java package com;/** * ...

  7. JAXB 转 XML乱码

    为JAXB和response设置编码,解决wechat4j中文乱码 1 https://blog.csdn.net/qing_gee/article/details/52788962 2 在web环境 ...

  8. spring-boot 引入xml注入bean

    2019独角兽企业重金招聘Python工程师标准>>> spring-boot 引入xml注入bean 配置 public class TestServiceImpl impleme ...

  9. Jaxb对xml报文头的小修小改

    前言: 也是在实际工作中, 借助jaxb来实现xml到java对象的映射转换. 在实际应用中, 也遇到了一些有趣好玩的东西, 权当记录下来. 本文主要讲解jaxb如何生成约定的xml报文头的实现思路, ...

最新文章

  1. 提升jmeter自身性能
  2. 分布式全局序列号生产,Twitter Snowflake算法,雪花算法
  3. 到底有多火?三家单位争抢发布,谷歌、清华、牛津同时提超越注意力的新机制...
  4. 拷贝Python对象、浅拷贝、深拷贝
  5. PHP小白学习日程之旅
  6. ASP.NET Core开发常见“坑”
  7. 简单线性回归预测实现
  8. 极限编程与敏捷开发(4)
  9. 回顾 - 判断质数精简算法
  10. Java函数式编程整理
  11. 工作中常用的linux命令,Linux工作中常用到的一些命令(持续更新)常用的
  12. 一文弄懂LogSumExp技巧
  13. 喜庆访问量突破200万
  14. Python运行常用平台有哪些?
  15. 单点登录 Oauth2认证 详解
  16. 2017.7.14 阿里巴巴校招面经
  17. win7怎样更改桌面计算机图标,教您电脑如何更改桌面图标
  18. 万豪国际亚太区第1000家酒店开业!总客房数量超一半在中国 | 美通社头条
  19. 在线文档查看器:Gleamtech Document Viewer 6.6.1
  20. VMware上安装CentOS系统

热门文章

  1. C语言——选择结构训练题
  2. Django配置大全
  3. SQL截取字符串的某一段
  4. python吃显卡还是内存不足_解决pytorch GPU 计算过程中出现内存耗尽的问题
  5. vscode 拉取不到新创的远程分支
  6. vue项目目录结构详解
  7. Android 黑科技
  8. idea取消屏幕中间的竖线
  9. MMGG聚焦 |“奇迹”Azuki为何爆火
  10. oracle新接触的sql语句