Xml解析和工具類的使用

前言

博主github

博主個人博客http://blog.healerjean.com

1 、解釋

1.1、@JacksonXmlRootElement

指定生成xml根標籤的名字;

1.2、@JacksonXmlProperty

指定包裝標籤名,或者指定標籤內部屬性名;

1.3、@JacksonXmlElementWrapper

用於指定List等集合類,外圍標籤名;用在非集合類上無效

1.4、@JacksonXmlText:

指定當前這個值,沒有xml標籤包裹。

2、測試

2.1、測試DTO

package com.healerjean.proj.a_test.xml;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.List;

/**
 * @author HealerJean
 * @ClassName Group
 * @date 2019/10/29  22:20.
 * @Description
 */
@Data
// @JacksonXmlRootElement:指定生成xml根標籤的名字;
@JacksonXmlRootElement(localName = "Class")
public class Group {

    private Teacher teacher;

    // @JacksonXmlElementWrapper:可用於指定List等集合類,外圍標籤名;
    @JacksonXmlElementWrapper(localName = "Students")
    // @JacksonXmlProperty:指定包裝標籤名,或者指定標籤內部屬性名;
    @JacksonXmlProperty(localName = "Stu")
    private List<Student> student;

    @Data
    @AllArgsConstructor
    public static class TeacherType {
        @JacksonXmlProperty(isAttribute = true, localName = "type")
        private String type;
        //@JacksonXmlText:指定當前這個值,沒有xml標籤包裹。
        // 這個值意義在於,一般這個值所在的類只有這一個正常屬性,或者其他屬性全部爲  @JacksonXmlProperty(isAttribute = true,
        @JacksonXmlText
        private String grade;

    }

    @Data
    public static class Teacher {
        @JacksonXmlProperty(localName = "TypeCode")
        private TeacherType teacherTypeCode;
        private String name;
    }

    @Data
    public static class Student {
        @JacksonXmlProperty(isAttribute = true, localName = "stu_id")
        private String id;
        private String name;
        private Integer age;
    }

}

2.2、測試類

    @Test
    public void test() {
        Group group = new Group();
        Group.Teacher teacher = new Teacher();
        teacher.setTeacherTypeCode(new TeacherType("語文老師", "A"));
        teacher.setName("馬老師");
        group.setTeacher(teacher);

        Student student = new Student();
        student.setId("001");
        student.setName("HealerJean");
        student.setAge(25);
        group.setStudent(Arrays.asList(student));

        String xml = XmlUtils.toXml(group);
        log.info("數據原文:【 {} 】", xml);
}
//XML標籤名:使用駱駝命名的屬性名,
xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
<Class>
    <Teacher>
        <Name>馬老師</Name>
        <TypeCode type="語文老師">A</TypeCode>
    </Teacher>
    <Students>
        <Stu stu_id="001">
            <Name>HealerJean</Name>
            <Age>25</Age>
        </Stu>
    </Students>
</Class>




自定義的轉化轉大寫並加下劃線,強制命令的不可以,比如下面的Class是強制命名的
 xmlMapper.setPropertyNamingStrategy(new UpperCaseSnackNamingStrategy());

<Class>
    <TEACHER>
        <NAME>馬老師</NAME>
        <TypeCode type="語文老師">A</TypeCode>
    </TEACHER>
    <Students>
        <Stu stu_id="001">
            <NAME>HealerJean</NAME>
            <AGE>25</AGE>
        </Stu>
    </Students>
</Class>

3、工具類

3.1、XmlUtils

package com.healerjean.proj.util.xml;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.healerjean.proj.util.xml.strategy.UpperCaseSnackNamingStrategy;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;


@Slf4j
public class XmlUtils {

    public static final XmlMapper xmlMapper;


    static {
        xmlMapper = new XmlMapper();
        SimpleModule module = new SimpleModule();
        xmlMapper.registerModule(module);
        xmlMapper.setDefaultUseWrapper(false);
        //字段爲null,自動忽略,不再序列化
        xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        //XML標籤名:使用駱駝命名的屬性名,
        // xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
        //轉化成加下劃線和大寫
        xmlMapper.setPropertyNamingStrategy(new UpperCaseSnackNamingStrategy());
        //設置轉換模式
        xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
    }


    public static String toXml(Object object) {
        try {
            return xmlMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            log.error("Xml轉換失敗", e);
            throw new RuntimeException("Xml轉換失敗", e);
        }
    }


    public static <T> T toObject(String xml, Class<T> c) {
        try {
            return xmlMapper.readValue(xml, c);
        } catch (IOException e) {
            log.error("Xml轉換失敗", e);
            throw new RuntimeException("Xml轉換失敗", e);
        }
    }




}

3.2、轉大寫並加下劃線

package com.healerjean.proj.util.xml.strategy;

import com.fasterxml.jackson.databind.PropertyNamingStrategy;

/**
 * @author HealerJean
 * @version 1.0v
 * @ClassName UpperCaseSnackNamingStrategy
 * @Date 2019/10/29  22:48.
 * @Description 轉大寫並加下劃線
 */
public class UpperCaseSnackNamingStrategy extends PropertyNamingStrategy.PropertyNamingStrategyBase {
    @Override
    public String translate(String input) {
        if (input == null) {
            return input;
        }
        int length = input.length();
        StringBuilder result = new StringBuilder(length * 2);
        int resultLength = 0;
        boolean wasPrevTranslated = false;
        for (int i = 0; i < length; i++) {
            char c = input.charAt(i);
            if (i > 0 || c != '_') {
                if (Character.isUpperCase(c)) {
                    if (!wasPrevTranslated && resultLength > 0 && result.charAt(resultLength - 1) != '_') {
                        result.append('_');
                        resultLength++;
                    }
                    wasPrevTranslated = true;
                } else {
                    wasPrevTranslated = false;
                }
                c = Character.toUpperCase(c);
                result.append(c);
                resultLength++;
            }
        }
        return resultLength > 0 ? result.toString() : input;
    }
}

ContactAuthor

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章