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());
    }
posted @   你午睡了吗~  阅读(506)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示