xml工具类-对象与xml互转
·
xml工具类-对象与xml互转
JAXB(Java Architecture for XML Binding)相关注解。@XmlRootElement、@XmlElement等注解
注解解释
- @XmlRootElement
@XmlRootElement注解用于将一个 Java 类映射为 XML 文档的根元素。它有以下几个属性:
name:指定生成的 XML 根元素的名称。在代码中,@XmlRootElement(name = “PACKET”)表示将WXResponseXmlVo类映射为 XML 文档时,根元素的名称为PACKET。 - @XmlElement
@XmlElement注解用于将 Java 类中的属性映射为 XML 文档中的子元素。它有以下常见属性:
name:指定生成的 XML 子元素的名称。在代码中,@XmlElement(name = “responsebody”) 表示将getResponseBodyVo方法对应的属性,在 XML 文档中映射为名为responsebody的子元素。 - @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(它创建成本较高),提升性能
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)