Xml转Java实体类对象 xml转Javabena 对象 且多级嵌套 复杂嵌套

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

最近在做企微开发,遇到了一个比较复杂的xml然后要去我将xml转成实体类
xml如下

<xml>
	<ToUserName><![CDATA[toUser]]></ToUserName>
	<FromUserName><![CDATA[sys]]></FromUserName> 
	<CreateTime>1403610513</CreateTime>
	<MsgType><![CDATA[event]]></MsgType>
	<Event><![CDATA[change_contact]]></Event>
	<ChangeType>create_user</ChangeType>
	<UserID><![CDATA[zhangsan]]></UserID>
	<Name><![CDATA[张三]]></Name>
	<Department><![CDATA[1,2,3]]></Department>
	<MainDepartment>1</MainDepartment>
	<IsLeaderInDept><![CDATA[1,0,0]]></IsLeaderInDept>
	<DirectLeader><![CDATA[lisi,wangwu]]></DirectLeader>
	<Position><![CDATA[产品经理]]></Position>
	<Mobile>13800000000</Mobile>
	<Gender>1</Gender>
	<Email><![CDATA[zhangsan@gzdev.com]]></Email>
	<BizMail><![CDATA[zhangsan@qyycs2.wecom.work]]></BizMail>
	<Status>1</Status>
	<Avatar><![CDATA[http://wx.qlogo.cn/mmopen/ajNVd]]>
        </Avatar>
	<Alias><![CDATA[zhangsan]]></Alias>
	<Telephone><![CDATA[020-123456]]></Telephone>
	<Address><![CDATA[广州市]]></Address>
	<ExtAttr>
		<Item>
		<Name><![CDATA[爱好]]></Name>
		<Type>0</Type>
		<Text>
			<Value><![CDATA[旅游]]></Value>
		</Text>
		</Item>
		<Item>
		<Name><![CDATA[卡号]]></Name>
		<Type>1</Type>
		<Web>
			<Title><![CDATA[企业微信]]></Title>
			<Url><![CDATA[https://work.weixin.qq.com]]></Url>
		</Web>
		</Item>
	</ExtAttr>
</xml>

为了看起来更加清晰我将这个xml转JSON 的放在下面

{
  "xml": {
    "ToUserName": "toUser",
    "FromUserName": "sys",
    "CreateTime": "1403610513",
    "MsgType": "event",
    "Event": "change_contact",
    "ChangeType": "create_user",
    "UserID": "zhangsan",
    "Name": "张三",
    "Department": "1,2,3",
    "MainDepartment": "1",
    "IsLeaderInDept": "1,0,0",
    "DirectLeader": "lisi,wangwu",
    "Position": "产品经理",
    "Mobile": "13800000000",
    "Gender": "1",
    "Email": "zhangsan@gzdev.com",
    "BizMail": "zhangsan@qyycs2.wecom.work",
    "Status": "1",
    "Avatar": "http://wx.qlogo.cn/mmopen/ajNVd",
    "Alias": "zhangsan",
    "Telephone": "020-123456",
    "Address": "广州市",
    "ExtAttr": {
      "Item": [
        {
          "Name": "爱好",
          "Type": "0",
          "Text": {
            "Value": "旅游"
          }
        },
        {
          "Name": "卡号",
          "Type": "1",
          "Web": {
            "Title": "企业微信",
            "Url": "https://work.weixin.qq.com"
          }
        }
      ]
    }
  }
}

由此我们发现企微回调的这个xml的层级比较复杂 那接下来我们将正式开始转Javabena对象

引入依赖

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>

根据映射关系建立实体类 并添加JAXB注解

  • @XmlRootElement。这是在JAXB中使用的Object必须有的注解。它定义了XML内容的根元素。
  • @XmlType。它将类映射到XML模式类型。我们可以用它来排列XML中的元素。
  • @XmlTransient。这将确保Object属性不被写入XML中。
  • @XmlAttribute: 这将创建Object属性作为一个属性。
  • @XmlElement(name = “ABC”): 这将创建名称为 "ABC "的元素。
  • @XmlElementWrapper: 注解表示生成一个包装器元素(一般用于集合元素)。
    我们注意到企微回调的xml层级比较复杂 那么这个实体类我们就要思考思考了
    我已经给你们建好了如下

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.*;
import java.util.List;
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlRootElement(name = "xml")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {
        "toUserName",
        "fromUserName",
        "createTime",
        "msgType",
        "event",
        "changeType",
        "userID",
        "name",
        "department",
        "mainDepartment",
        "isLeaderInDept",
        "directLeader",
        "position",
        "mobile",
        "gender",
        "email",
        "bizMail",
        "status",
        "avatar",
        "alias",
        "telephone",
        "address",
        "items",


})
public class MemberXml {
    @XmlElement(name = "ToUserName",required = true)
    private String toUserName;
    @XmlElement(name = "FromUserName",required = true)
    private String fromUserName;
    @XmlElement(name = "CreateTime",required = true)
    private String createTime;
    @XmlElement(name = "MsgType",required = true)
    private String msgType;
    @XmlElement(name = "Event",required = true)
    private String event;
    @XmlElement(name = "ChangeType",required = true)
    private String changeType;
    @XmlElement(name = "UserID",required = true)
    private String userID;
    @XmlElement(name = "Name",required = true)
    private String name;
    @XmlElement(name = "Department",required = true)
    private String department;
    @XmlElement(name = "MainDepartment",required = true)
    private String mainDepartment;
    @XmlElement(name = "IsLeaderInDept",required = true)
    private String isLeaderInDept;
    @XmlElement(name = "DirectLeader",required = true)
    private String directLeader;
    @XmlElement(name = "Position",required = true)
    private String position;
    @XmlElement(name = "Mobile",required = true)
    private String mobile;
    @XmlElement(name = "Gender",required = true)
    private String gender;
    @XmlElement(name = "Email",required = true)
    private String email;
    @XmlElement(name = "BizMail",required = true)
    private String bizMail;
    @XmlElement(name = "Status",required = true)
    private String status;
    @XmlElement(name = "Avatar",required = true)
    private String avatar;
    @XmlElement(name = "Alias",required = true)
    private String alias;
    @XmlElement(name = "Telephone",required = true)
    private String telephone;
    @XmlElement(name = "Address",required = true)
    private String address;
    @XmlElementWrapper(name = "ExtAttr",required = true)
    @XmlElement(name = "Item",required = true)
    private List<Item> items;

}



import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.xml.bind.annotation.*;
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlRootElement(name = "Item")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder ={
        "type",
        "name",
        "webValue",
        "textValue"

} )
public class Item {
    @XmlElement(name = "Type",required = true)
    private String type;

    @XmlElement(name = "Name",required = true)
    private String name;

    @XmlElement(name = "Text",required = true)
    private TextValue textValue;

    @XmlElement(name = "Web",required = true)
    private WebValue webValue;
}


import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.*;

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Text")
@XmlType(propOrder ={
        "value"
} )
public class TextValue {
    @XmlElement(name = "Value",required = true)
    private String value;
}


import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.*;

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlRootElement(name = "Web")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder ={
        "title",
        "url"
} )
public class WebValue {
    @XmlElement(name = "Title",required = true)
    private String title;
    @XmlElement(name = "Url",required = true)
    private String url;

}

创建xml和实体互转的工具类

public class JaxbUtil {
 
	/**
	 * JavaBean转换成xml
	 * 
	 * @param obj
	 * @param encoding
	 * @return
	 */
	public static String convertToXml(Object obj, String encoding) {
		String result = null;
		try {
			JAXBContext context = JAXBContext.newInstance(obj.getClass());
			Marshaller marshaller = context.createMarshaller();
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
 
			StringWriter writer = new StringWriter();
			marshaller.marshal(obj, writer);
			result = writer.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
 
		return result;
	}
 
	/**
	 * xml转换成JavaBean
	 * 
	 * @param xml
	 * @param c
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T converyToJavaBean(String xml, Class<T> c) {
		T t = null;
		try {
			JAXBContext context = JAXBContext.newInstance(c);
			Unmarshaller unmarshaller = context.createUnmarshaller();
			t = (T) unmarshaller.unmarshal(new StringReader(xml));
		} catch (Exception e) {
			e.printStackTrace();
		}
 
		return t;
	}
}

测试

现在我们测试一下 将xml与实体类对象传入

打印测试结果

成功

当然如果有人发现Items没有赋值成功 那就要检查实体类中的注解是否正确

比如根节点是否标记正确

Java中实现XML对象的实战指南及测试案例 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它在互联网上应用广泛,为不同的系统之间提供了数据交换的能力。其核心是用标签来标记信息,形成易于人们阅读和机器解析的数据结构。它不同于HTML,HTML主要用于展示数据,而XML专注于描述数据。XML的自定义性质使其适用于各种不同的应用,并能够适应不断发展的网络需求。与数据库存储的数据结构相比,XML更加灵活,能够容纳结构不同的数据。它不仅能够描述信息内容,还能够描述信息结构,使得XML文档具有可读性和结构清晰的特点。 阅读详情

相关推荐

trang工具xml自动生成实体类,xds文件自动生成实体类

将trang.jar和要解析的xml放在同一目录,在当前文件下执行如下命令,其中users.xsd为要生成的xsd文件名 java -jar trang.jar users.xml users.xsd 执行完上述命令后会在当前文件生成users.xsd,然后执行如下命令,其中-p后com.bean是包名,-d后是要生成到哪的文件目录 xjc -p com.bean users.xsd -d F:\

xml Java bean工具

xml Java bean工具

JAXB工具类 xmljava对象 java对象xml

JAXB工具类 xmljava对象 java对象xml ,本人亲测,可以使用!!!

java--- xml对象之间的互相转换

使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。converter主要用于将某些字段进行复杂转换转换过程写在一个类中。此xstream实例,为线程安全的,可以供多个线程进行调用,共享使用。文件反序列化的时候,不需要其它辅助类和映射文件,使得。需要指定bean中的属性和xml的属性一一对应。或反序列化,使用非常方便。

m0_56076357的博客 1万+

javaXMLJSON、JSONXMLXML对象(Object)、对象(Object)XML,利用XSD验证XML(手把手教你如何接收、处理、验证XML数据)

在实际项目开发过程中,尤其是web项目的开发,我们或多或少会使用XML格式的数据进行数据交换;即使自己的项目用不到,但和第三方接口对接时,也是会经常遇到用XML格式数据的第三方接口,因为XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。所以对XML数据的处理是必须要掌握的。下面就手把手拿一个真实的接口对接案例来教你们如何处理这类数据,耐心看下去。...............

qq_43907515的博客 1万+

java开发日常之XML字符格式java对象

本文介绍开发日常中遇到的将xml节点内容转换java对象

qq_32590535的博客 2285

XML字符串实体类

XML字符串实体类

wsdhla的专栏 2305

xmljava对象转换

jackson-dataformat-xml工具包xmljava对象转换说明

qq_41307221的博客 5259

xml对象之间的互相转换以及json和对象之间的互相转换

json、对象实体类xml的互相转换,jaxb

qq_58846203的博客 3681

JAVAxml数据实体类

java处理xml文件,将内容实体类

Superwwz的博客 4843

Java 解析XML对象

java 使用dom4j解析XML对象

夕四 3540

Java xml文件动态转换成类对象

我整理的一些关于【XML】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/Hpqqk2如何将 Java XML 文件动态转换成类对象 在软件开发中,我们经常需要将 XML 文件中的数据读取并转换Java对象。在本文中,我将指导你如何实现这个过程。整个流程可以分为几个主...

weixin_40956570的博客 861

JAVA xml格式java对象

【代码】JAVA xml格式java对象

Amelia_Liu的博客 804

Java对象xml文件之间的互相转换

这里提供了一个工具类,可以直接复制用的,使用的是原生的不依赖任何第三方jar包的。转换示例这里也提供了,需要的可以收藏起来!

怪咖@的博客 7462

Springboot项目中导入xml文件Java对象+注解详解

Springboot项目中导入xml文件Java对象+注解详解

鸢尾_的博客 3950

三种XML字符串js对象方法

分享三种XML字符串js对象方法,含attribute通用

支付宝转账20r看蟹黄堡配方 的博客 3090

JAVA如何把XML文件对象

上图为xml的文件内容对象类 代码的实现:

song_lyzz的博客 5430

xml报文Java实体

因为需要对接一些比较老的系统接口,他们的请求方式不是JSON数据结构,一般会采用xml数据结构来作为数据的入参和返参。因为我们的系统是通过JSON数据进行交互的突然接入xml数据结构的会比较的麻烦,麻烦的体现在xml数据结构比较复杂,同时如果采用字符串拼接的话会比较的难以维护。通过JAXBContext来将xml字符串Java实体或者把Java实体xml字符串

h_j_c_123的博客 3062

JAXB - xml对象转换

JAXB 解析 xml, 实现对象xml的互相转换

空明的博客 1762
下一篇: Linux安装jdk1.8 通过 yum 一键安装
juntaonb
博客等级 码龄6年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值