利用jackson-dataformat-xml包中的XmlMapper类将xml解析成实体类对象

本文介绍如何使用Jackson的jackson-dataformat-xml模块进行XML数据的解析与序列化,通过具体示例展示了实体类与XML标签的映射过程,包括属性注解、配置属性等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近负责一个从第三方接口获取数据,并对数据封装的项目,项目中也有用到json格式数据,因此堪虑用Jackson中的jackson-dataformat-xml来解析xml,具体如下:

maven引入jar包

在这里插入图片描述

实体类

GradeDomain

public class GradeDomain {

@JacksonXmlProperty(localName = "gradeId",isAttribute = true)
private int gradeId;

@JacksonXmlText
private String gradeName;
......(get和set方法省略)

}
ScoreDomain

public class ScoreDomain {
@JacksonXmlProperty(localName = "scoreName")
@JacksonXmlCData
private String name;

@JacksonXmlProperty(localName = "scoreNumber")
private int score;
......(get和set方法省略)

}
StudentDomain

@JacksonXmlRootElement(localName = "student")
public class StudentDomain {

@JsonIgnore
private String studentName;

@JacksonXmlProperty(localName = "age")
@JacksonXmlCData
private int age;

@JacksonXmlProperty(localName = "grade")
private GradeDomain grade;

@JacksonXmlElementWrapper(localName = "scoreList")
@JacksonXmlProperty(localName = "score")
private List<ScoreDomain> scores;
......(get和set方法省略)

}

XmlMapper配置属性

ObjectMapper xmlMapper = new XmlMapper();
//反序列化时,若实体类没有对应的属性,是否抛出JsonMappingException异常,false忽略掉
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//序列化是否绕根元素,true,则以类名为根元素
xmlMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
//忽略空属性
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//XML标签名:使用骆驼命名的属性名,
xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
//设置转换模式
xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING);

main方法中具体的使用

public static void main(String[] agr) throws JsonProcessingException {

    ObjectMapper xmlMapper = new XmlMapper();
    xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    xmlMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
    xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
    xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
    StudentDomain domain = new StudentDomain();
    
    domain.setStudentName("张三");
    domain.setAge(18);
    GradeDomain grade = new GradeDomain();
    grade.setGradeId(1);
    grade.setGradeName("高三");
    domain.setGrade(grade);
    ScoreDomain score1 = new ScoreDomain();
    score1.setName("语文");
    score1.setScore(90);
    ScoreDomain score2 = new ScoreDomain();
    score2.setName("数学");
    score2.setScore(98);
    ScoreDomain score3 = new ScoreDomain();
    score3.setName("英语");
    score3.setScore(91);
    List<ScoreDomain> scores = Arrays.asList(score1,score2,score3);
    domain.setScores(scores);
    String xml = xmlMapper.writeValueAsString(domain);
    System.out.println(xml);
    StudentDomain studentDomain = xmlMapper.readValue(xml,StudentDomain.class);
    System.out.println(studentDomain);
    }

结果:

实体类转成xml:
在这里插入图片描述
xml转成实体类:

在这里插入图片描述

注解说明

@JacksonXmlRootElement用于类名,是xml最外层的根节点。注解中有localName属性,该属性如果不设置,那么生成的XML最外面就是Clazz.
@JacksonXmlCData注解是为了生成<![CDATA[text]]>
@JacksonXmlProperty注解通常可以不需要,若不用,生成xml标签名称就是实体类属性名称。但是如果你想要你的xml节点名字,首字母大写。比如例子中的Content,那么必须加这个注解,并且注解的localName填上你想要的节点名字。最重要的是!实体类原来的属性content必须首字母小写!否则会被识别成两个不同的属性。注解的isAttribute,确认是否为节点的属性,如上面“gradeId”。
@JacksonXmlElementWrapper一般用于list,list外层的标签。若不用的话,useWrapping =false
@JacksonXmlText,用实体类属性上,说明该属性是否为简单内容,如果是,那么生成xml时,不会生成对应标签名称
@JsonIgnore,忽略该实体类的属性,该注解是用于实体类转json的,但用于转xml一样有效,具体原因个人推测是XmlMapper是ObjectMapper的子类。

以上都是个人意见,若有错,请大佬指出来,谢谢!

在Java中,将实体对象XML报文相互转换是一项常见的需求,尤其在数据交换和配置管理中。以下是一些常用的工具和库,可以帮助实现这一功能: 1. **JAXB (Java Architecture for XML Binding)**: JAXB是Java提供的一个标准API,用于将Java对象XML进行绑定。它可以将Java对象序列化为XML,也可以将XML反序列化为Java对象。 ```java import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import java.io.StringReader; import java.io.StringWriter; public class JAXBExample { public static void main(String[] args) throws JAXBException { // 创建JAXB上下文 JAXBContext context = JAXBContext.newInstance(YourClass.class); // 序列化对象XML Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); StringWriter sw = new StringWriter(); marshaller.marshal(new YourClass(), sw); String xmlContent = sw.toString(); System.out.println(xmlContent); // 反序列化XML对象 Unmarshaller unmarshaller = context.createUnmarshaller(); StringReader sr = new StringReader(xmlContent); YourClass object = (YourClass) unmarshaller.unmarshal(sr); System.out.println(object); } } ``` 2. **Jackson**: Jackson是一个流行的Java库,主要用于JSON处理,但也可以处理XML。它提供了灵活的API来序列化和反序列化对象。 ```java import com.fasterxml.jackson.dataformat.xml.XmlMapper; import java.io.IOException; public class JacksonXMLExample { public static void main(String[] args) throws IOException { XmlMapper xmlMapper = new XmlMapper(); // 序列化对象XML YourClass object = new YourClass(); String xmlContent = xmlMapper.writeValueAsString(object); System.out.println(xmlContent); // 反序列化XML对象 YourClass deserializedObject = xmlMapper.readValue(xmlContent, YourClass.class); System.out.println(deserializedObject); } } ``` 3. **XStream**: XStream是一个简单的库,用于将Java对象序列化为XML并反序列化回来。它不需要任何映射文件或注释。 ```java import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; import java.io.StringReader; import java.io.StringWriter; public class XStreamExample { public static void main(String[] args) { XStream xstream = new XStream(new DomDriver()); // 序列化对象XML YourClass object = new YourClass(); String xmlContent = xstream.toXML(object); System.out.println(xmlContent); // 反序列化XML对象 YourClass deserializedObject = (YourClass) xstream.fromXML(xmlContent); System.out.println(deserializedObject); } } ``` 这些工具各有优缺点,选择哪一个取决于具体需求和项目环境。JAXB是Java的标准解决方案,Jackson在处理JSON和XML时都非常强大,而XStream则以其简单性和灵活性著称。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值