xml工具类-对象与xml互转

JAXB(Java Architecture for XML Binding)相关注解。@XmlRootElement、@XmlElement等注解

注解解释

  1. @XmlRootElement
    @XmlRootElement注解用于将一个 Java 类映射为 XML 文档的根元素。它有以下几个属性:
    name:指定生成的 XML 根元素的名称。在代码中,@XmlRootElement(name = “PACKET”)表示将WXResponseXmlVo类映射为 XML 文档时,根元素的名称为PACKET。
  2. @XmlElement
    @XmlElement注解用于将 Java 类中的属性映射为 XML 文档中的子元素。它有以下常见属性:
    name:指定生成的 XML 子元素的名称。在代码中,@XmlElement(name = “responsebody”) 表示将getResponseBodyVo方法对应的属性,在 XML 文档中映射为名为responsebody的子元素。
  3. @XmlAttribute
    @XmlAttribute注解用于将 Java 类中的属性映射为 XML 文档中的属性。例如代码中的@XmlAttribute(name = “TYPE”),表示将getType方法对应的属性,在 XML 文档中映射为名为TYPE的属性

maven依赖

要使用 JAXB 相关注解,需要在 Maven 项目的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</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>```


对于 Java 9 及以上版本,还需要额外添加:
xml
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

xml实体类

@XmlRootElement(name = "PACKET")
public class AutoImageRequestXmlVo implements Serializable {

	private static final long serialVersionUID = 964217472292427474L;

	private String type = "REQUEST";
	private String version = "1.0";
	private ImageRequestHead head;
	private ImageRequestBody body;

	@XmlAttribute(name = "TYPE")
	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	@XmlAttribute(name = "VERSION")
	public String getVersion() {
		return version;
	}

	public void setVersion(String version) {
		this.version = version;
	}

	@XmlElement(name = "RequestHead")
	public ImageRequestHead getHead() {
		return head;
	}

	public void setHead(ImageRequestHead head) {
		this.head = head;
	}

	@XmlElement(name = "RequestBody")
	public ImageRequestBody getBody() {
		return body;
	}

	public void setBody(ImageRequestBody body) {
		this.body = body;
	}
}

使用方法

(1)定义 Java 类并添加注解:按照上述方式,在需要映射为 XML 的 Java 类和属性上添加相应的 JAXB 注解,如@XmlRootElement、@XmlElement、@XmlAttribute 等。
(2)进行 XML 和 Java 对象的转换:可以使用JAXBContext、Marshaller和Unmarshaller类来实现 XML 和 Java 对象之间的转换。示例代码如下:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.File;

public class Main {
    public static void main(String[] args) {
        try {
            // 创建JAXBContext对象
            JAXBContext jaxbContext = JAXBContext.newInstance(WXResponseXmlVo.class);

            // 创建Marshaller对象,用于将Java对象转换为XML
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            WXResponseXmlVo responseVo = new WXResponseXmlVo();
            // 设置对象属性值
            responseVo.setType("REQUEST");
            responseVo.setVersion("1.0");
            marshaller.marshal(responseVo, new File("output.xml"));

            // 创建Unmarshaller对象,用于将XML转换为Java对象
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            WXResponseXmlVo result = (WXResponseXmlVo) unmarshaller.unmarshal(new File("output.xml"));
            System.out.println(result.getType());
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

应用场景

  • Web 服务交互:在开发 Web 服务(如 SOAP 服务)时,常常需要将 Java 对象与 XML 格式进行转换,以便于在不同系统之间传输数据。
  • 配置文件处理:可以将配置信息以 XML 格式存储,然后通过 JAXB 将 XML 解析为 Java 对象,方便在程序中读取和操作配置。
  • 数据持久化:某些场景下,需要将对象数据以 XML 格式存储到文件或数据库中,使用 JAXB 注解可以方便地实现对象与 XML 之间的转换。

xml和对象互转工具类

对象转xml
public static String obj2Xml(Class c, Object o) throws JAXBException {
    // 1. 创建 JAXBContext:用于管理 XML 与 Java 映射的上下文
    JAXBContext context = JAXBContext.newInstance(c); 
    // 2. 创建 Marshaller:负责将 Java 对象序列化为 XML
    Marshaller marshaller = context.createMarshaller(); 
    // 3. 配置格式化输出:让生成的 XML 有缩进、换行,更易读
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    // 4. 配置编码:指定 XML 内容的编码为 GBK(解决中文乱码常用)
    marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK"); 
    // 5. 创建 StringWriter:作为临时容器,接收 Marshaller 输出的 XML 内容
    StringWriter writer = new StringWriter(); 
    // 6. 执行转换:把 Java 对象 o 转成 XML,写入 StringWriter
    marshaller.marshal(o, writer); 
    // 7. 处理 XML 字符串(以下为“修改变换”逻辑,按需处理特定内容)
    String requestXml = (writer.toString()
        // 移除 standalone="yes" 属性(部分场景下不需要该声明)
        .replaceFirst("standalone=\"yes\"", "") 
        // 移除空的 <prpLpersonItemList/> 标签(可能因空集合生成,按需清理)
        .replaceAll("<prpLpersonItemList/>", "") 
        // 代码截图不全,推测继续清理其他空标签(如 <prpLpersonLoss...)
        .replaceAll("<prpLpersonLoss...", "")); 
    // 8. 记录日志:输出转换后的 XML 内容(便于调试、排查问题)
    log.info("java对象转str,结果为:" + requestXml); 
    // 9. 返回最终处理后的 XML 字符串
    return requestXml; 
}
  • 核心逻辑:
    利用 JAXB 的 Marshaller,把 Java 对象转成 XML 字符串,再通过字符串替换清理无关内容(如空标签、特定属性),最后返回格式化好的 XML。
xml字符串转对象
public static Object xml2Obj(Class c, String str) throws JAXBException {
    // 1. 创建 JAXBContext:和 obj2Xml 逻辑一致,初始化上下文
    JAXBContext context = JAXBContext.newInstance(c); 
    // 2. 创建 Unmarshaller:负责将 XML 反序列化为 Java 对象
    Unmarshaller unmarshaller = context.createUnmarshaller(); 
    // 3. 创建 StringReader:把 XML 字符串 str 转成 Reader,供 Unmarshaller 读取
    StringReader sr = new StringReader(str); 
    // 4. 执行反序列化:将 XML 内容转成对应 Java 类型的对象并返回
    return unmarshaller.unmarshal(sr); 
}
  • 核心逻辑:
    通过 JAXB 的 Unmarshaller,把 XML 字符串解析成 Java 对象,实现 XML → Java 对象的逆向转换
异常与优化:
  • 方法直接抛出 JAXBException,建议在调用处 捕获并处理异常(如记录详细日志、返回默认值),避免程序崩溃。
  • 若频繁转换同一种 Class,可缓存 JAXBContext(它创建成本较高),提升性能
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐