目录
- XML和Bean转换工具简介
- JAXB简介
- [Java Bean类](#Java Bean类)
- XMLUtil工具类
另一篇转换方式
xstream实现xml和java bean 互相转换
XML和Bean转换工具简介
Java中实现XML和Bean的转换的方式或插件有以下几种:
JAXB(Java Architecture for XML Binding):JAXB是Java SE的一部分,可以将Java对象与XML文档相互转换。它提供了注解和XML绑定文件两种配置方式。
Dom4j:Dom4j是一个开源的Java库,用于操作XML文档。它可以将XML文档转换为Java对象,也可以将Java对象转换为XML文档。
XStream:XStream是一个简单易用的Java库,用于序列化和反序列化对象。它可以将Java对象转换为XML文档,也可以将XML文档转换为Java对象。
SimpleXML:SimpleXML是一个轻量级的Java库,用于处理XML文档。它可以将XML文档转换为Java对象,也可以将Java对象转换为XML文档。
Jackson:Jackson是一个流行的Java库,用于处理JSON数据。它也支持将Java对象转换为XML文档,以及将XML文档转换为Java对象。
JiBX:JiBX是一个强大的Java库,用于处理XML文档。它可以将Java对象与XML文档相互转换,支持多种映射策略。
Castor:Castor是一个高性能的Java库,用于处理XML文档。它可以将Java对象与XML文档相互转换,支持多种映射策略。
Apache CXF:Apache CXF是一个开源的Web服务框架,提供了许多用于处理XML和SOAP消息的功能。它支持将Java对象与XML文档相互转换。
JAXB简介
这里介绍一下 JAXB,JAXB(Java Architecture for XML Binding)是Java SE的一部分,不需要依赖其他包,可以将Java对象与XML文档相互转换。
下面是主要介绍常用的注解的基本含义和区别:
- @XmlAccessorType: 这个注解用来指定类或属性(字段)的访问类型。它有四个可能的值:FIELD, TYPE, PROPERTY, ALL。默认情况下,JAXB使用FIELD模式,这意味着JAXB将尝试访问类中的所有字段。如果这个注解不存在,那么JAXB将使用默认值。
- @XmlRootElement: 这个注解标记一个类作为XML根元素。JAXB将生成一个XML文档,该文档包含根元素以及由类字段/属性定义的任何其他元素。
- @XmlElement(name = "Label"): 这个注解表示一个类属性或字段被映射到一个XML元素,并且这个元素的标签名称为"Label"。
- @XmlAttribute: 这个注解表示一个类属性或字段被映射到一个XML属性。属性是在XML元素中定义的,并且通常用于表示元素的简单类型值。
- @XmlType(propOrder = {"value", "category", "background"}): 这个注解定义了当一个类被映射到XML时,元素和属性的顺序。在这个例子中,"value"是首先出现的元素,"category"和"background"是接下来的元素。如果你在propOrder中没有指定元素名称,那么它们将按照它们在类中出现的顺序进行映射。
使用这些注解的方式通常是在你的Java类中添加它们。例如下边的Java Bean类。
Java Bean类
java
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "View")
@XmlType(propOrder = {})
@Getter
@Setter
public class View implements Serializable {
private static final long serialVersionUID = 4678366086955878610L;
@XmlElement(name = "Image")
private Image image;
@XmlElement(name = "Table")
private Table table;
@XmlElement(name = "Text")
private Text text;
@XmlElement(name = "Choices")
private Choices choices;
@XmlElement(name = "RectangleLabels")
private RectangleLabels rectangleLabels;
@XmlElement(name = "Labels")
private Labels labels;
@XmlElement(name = "Rectangle")
private Rectangle rectangle;
@XmlElement(name = "Polygon")
private Polygon polygon;
@XmlElement(name = "TextArea")
private TextArea textArea;
}
java
import java.io.Serializable;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import lombok.Getter;
import lombok.Setter;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Labels")
@XmlType(propOrder = {
"name",
"toName",
"labelList"
})
@Setter
@Getter
public class Labels implements Serializable {
private static final long serialVersionUID = 4017289488745470829L;
@XmlAttribute
private String name;
@XmlAttribute
private String toName;
@XmlElement(name = "Label")
private List<Label> labelList;
}
java
import java.io.Serializable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import lombok.Getter;
import lombok.Setter;
@XmlAccessorType(XmlAccessType.FIELD)
// XML文件中的根标识
@XmlRootElement(name = "Label")
// 控制JAXB 绑定类中属性和字段的排序
@XmlType(propOrder = {
"value",
"category",
"background"
})
@Getter
@Setter
public class Label implements Serializable {
private static final long serialVersionUID = 5135918993113626857L;
@XmlAttribute
private String value;
@XmlAttribute
private String category;
@XmlAttribute
private String background;
}
XMLUtil工具类
java
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class XMLUtil {
private XMLUtil(){}
public static Object convertXMLToObject(Class<?> clazz, String xml) {
Object xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
// 进行将Xml转成对象的核心接口
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader sr = new StringReader(xml);
xmlObject = unmarshaller.unmarshal(sr);
} catch (Exception ex) {
log.error("XML转换对象失败", ex);
}
return xmlObject;
}
public static String convertToXml(Object obj) {
// 创建输出流
StringWriter sw = new StringWriter();
try {
// 利用jdk中自带的转换类实现
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml输出的格式 true 带格式化 false 不带格式化
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
// true 忽略xml头信息
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
// 将对象转换成输出流形式的xml
marshaller.marshal(obj, sw);
} catch (JAXBException e) {
log.error("对象转XML失败", e);
}
return sw.toString();
}
}