主页 > 电脑硬件  > 

JAXB实现XML和Bean相互转换

JAXB实现XML和Bean相互转换

目录 XML和Bean转换工具简介JAXB简介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类 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; } 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; } 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工具类 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(); } }
标签:

JAXB实现XML和Bean相互转换由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“JAXB实现XML和Bean相互转换