xml与java对象转换
jackson-dataformat-xml工具包xml与java对象转换说明
1、引入依赖包
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.10.2</version>
</dependency>
2、测试使用的对象
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.util.List;
/**
* 测试对象School,包含普通属性name:名称 列表属性grades:多个Grade对象集合
*/
public class School {
@JacksonXmlProperty(localName = "NAME")
private String name;
@JacksonXmlElementWrapper(localName = "Grades")
@JacksonXmlProperty(localName = "Grade")
private List<Grade> grades;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Grade> getGrades() {
return grades;
}
public void setGrades(List<Grade> grades) {
this.grades = grades;
}
}
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.util.List;
/**
* 测试对象Grade,包含普通属性name:名称 列表属性Classes:多个Classes对象集合
*/
public class Grade {
@JacksonXmlProperty(localName = "NAME")
private String name;
@JacksonXmlElementWrapper(localName = "ClassList")
@JacksonXmlProperty(localName = "Class")
private List<Classes> classes;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Classes> getClasses() {
return classes;
}
public void setClasses(List<Classes> classes) {
this.classes = classes;
}
}
/**
* 测试对象Classes,包含普通属性name:名称 属性studentCount:数量
*/
public class Classes {
private String name;
private Integer studentCount;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getStudentCount() {
return studentCount;
}
public void setStudentCount(Integer studentCount) {
this.studentCount = studentCount;
}
}
3、单元测试和效果
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
public class ObjectToXml {
//创建XmlMapper对象,用于实体与json和xml之间的相互转换
private static final XmlMapper xmlMapper = new XmlMapper();
@Test
public void t1() throws Exception {
School school = new School();
school.setName("学校名称");
Grade grade1 = new Grade();
grade1.setName("年级1");
Grade grade2 = new Grade();
grade2.setName("年级2");
Grade grade3 = new Grade();
grade3.setName("年级3");
Grade grade4 = new Grade();
grade4.setName("年级4");
Classes classes1 = new Classes();
classes1.setName("年级1-班级1");
classes1.setStudentCount(60);
Classes classes2 = new Classes();
classes2.setName("年级1-班级2");
classes2.setStudentCount(50);
Classes classes3 = new Classes();
classes3.setName("年级1-班级3");
classes3.setStudentCount(52);
List<Classes> classesList1 = new ArrayList<>();
classesList1.add(classes1);
classesList1.add(classes2);
classesList1.add(classes3);
grade1.setClasses(classesList1);
Classes classes4 = new Classes();
classes4.setName("年级2-班级1");
classes4.setStudentCount(45);
Classes classes5 = new Classes();
classes5.setName("年级2-班级2");
classes5.setStudentCount(46);
Classes classes6 = new Classes();
classes6.setName("年级2-班级3");
classes6.setStudentCount(42);
List<Classes> classesList2 = new ArrayList<>();
classesList2.add(classes4);
classesList2.add(classes5);
classesList2.add(classes6);
grade2.setClasses(classesList2);
List<Grade> grades = new ArrayList<>();
grades.add(grade1);
grades.add(grade2);
grades.add(grade3);
grades.add(grade4);
school.setGrades(grades);
String xmlStr = xmlMapper.writeValueAsString(school);
xmlStr = formatXML(xmlStr);
System.out.println(xmlStr);
}
/**
* 格式化xml
* @param inputXML
* @return
* @throws Exception
*/
public String formatXML(String inputXML) throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new StringReader(inputXML));
String requestXML = null;
XMLWriter writer = null;
if (document != null) {
try {
StringWriter stringWriter = new StringWriter();
OutputFormat format = new OutputFormat(" ", true);
format.setTrimText(true);
format.setExpandEmptyElements(true);
writer = new XMLWriter(stringWriter, format);
writer.write(document);
writer.flush();
requestXML = stringWriter.getBuffer().toString();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
}
}
}
}
return requestXML;
}
}
输出效果:
<?xml version="1.0" encoding="UTF-8"?>
<School>
<NAME>学校名称</NAME>
<Grades>
<Grade>
<NAME>年级1</NAME>
<ClassList>
<Class>
<name>年级1-班级1</name>
<studentCount>60</studentCount>
</Class>
<Class>
<name>年级1-班级2</name>
<studentCount>50</studentCount>
</Class>
<Class>
<name>年级1-班级3</name>
<studentCount>52</studentCount>
</Class>
</ClassList>
</Grade>
<Grade>
<NAME>年级2</NAME>
<ClassList>
<Class>
<name>年级2-班级1</name>
<studentCount>45</studentCount>
</Class>
<Class>
<name>年级2-班级2</name>
<studentCount>46</studentCount>
</Class>
<Class>
<name>年级2-班级3</name>
<studentCount>42</studentCount>
</Class>
</ClassList>
</Grade>
<Grade>
<NAME>年级3</NAME>
</Grade>
<Grade>
<NAME>年级4</NAME>
</Grade>
</Grades>
</School>
4、注解说明
1、@JacksonXmlProperty
注解是用于对象属性,源代码如下,
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface JacksonXmlProperty { boolean isAttribute() default false; String namespace() default ""; String localName() default ""; }
包含三个可设置属性,
localName:表明在当前转换的xml串中,次属性的标签名称,如上面转换出来的
学校名称 标签,namespace:设置命名空间,假设给school对象的name属性设置命名空间:@JacksonXmlProperty(localName = "NAME",namespace = "xxx")
输出效果如下:
<wstxns1:NAME xmlns:wstxns1="xxx">学校名称</wstxns1:NAME>
isAttribute:设置该属性是否为标签内属性,默认为false
设置示例:把School对象的那么设置为标签内属性:
@JacksonXmlProperty(localName = "NAME",isAttribute = true)
效果:NAME属性不在独立成为标签,而是成为School标签的内属性
2、@JacksonXmlElementWrapper
作用于对象的集合属性上,@JacksonXmlElementWrapper(localName = "ClassList"),能够让集合属性决定是否使用包装元素,并且也可以控制包装元素的本地名称和命名空间。
<ClassList> <Class> <name>年级2-班级1</name> <studentCount>45</studentCount> </Class> <Class> <name>年级2-班级2</name> <studentCount>46</studentCount> </Class> <Class> <name>年级2-班级3</name> <studentCount>42</studentCount> </Class> </ClassList>
对象转xml字符串以上注解基本可以实现所需功能,其中转换出来的字符串是连接的,需要格式化一下方便查看结构
5、xml串转换对象
@Test
public void t2() throws JsonProcessingException {
String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"\n" +
"<School>\n" +
" <NAME>学校名称</NAME>\n" +
" <Grades>\n" +
" <Grade>\n" +
" <NAME>年级1</NAME>\n" +
" <ClassList>\n" +
" <Class>\n" +
" <name>年级1-班级1</name>\n" +
" <studentCount>60</studentCount>\n" +
" </Class>\n" +
" <Class>\n" +
" <name>年级1-班级2</name>\n" +
" <studentCount>50</studentCount>\n" +
" </Class>\n" +
" <Class>\n" +
" <name>年级1-班级3</name>\n" +
" <studentCount>52</studentCount>\n" +
" </Class>\n" +
" </ClassList>\n" +
" </Grade>\n" +
" <Grade>\n" +
" <NAME>年级2</NAME>\n" +
" <ClassList>\n" +
" <Class>\n" +
" <name>年级2-班级1</name>\n" +
" <studentCount>45</studentCount>\n" +
" </Class>\n" +
" <Class>\n" +
" <name>年级2-班级2</name>\n" +
" <studentCount>46</studentCount>\n" +
" </Class>\n" +
" <Class>\n" +
" <name>年级2-班级3</name>\n" +
" <studentCount>42</studentCount>\n" +
" </Class>\n" +
" </ClassList>\n" +
" </Grade>\n" +
" <Grade>\n" +
" <NAME>年级3</NAME>\n" +
" </Grade>\n" +
" <Grade>\n" +
" <NAME>年级4</NAME>\n" +
" </Grade>\n" +
" </Grades>\n" +
"</School>";
School school = xmlMapper.readValue(xmlStr,School.class);
System.out.println(school.getName());
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南