jackson处理标签中带属性的xml

发布时间 2023-09-02 16:38:43作者: EPIHPANY

用jackson相关包把如下xml转为java bean

<Configuration shutdownHook="disable" packages="org.ironrhino.core.log4j">
    <Properties>
        <Property name="app.home">/tmp/app</Property>
        <Property name="port.http"></Property>
    </Properties>
    <Appenders>
        <Console name="CONSOLE" target="SYSTEM_OUT">
            <ThresholdFilter level="${sys:console.logger.level}"/>
            <PatternLayout pattern="%style{%d %25.25t %60.60c{1.}}{cyan} %highlight{%p %m%n}" noConsoleNoAnsi="true"/>
        </Console>
        <File name="DEBUG" fileName="${sys:app.home}/logs/${sys:port.http}/application-debug.log">
            <PatternLayout pattern="%d %c %t%X{request}%X{url} %p %m%n%th{10}" charset="UTF-8"/>
        </File>
        <RollingFile name="APPLICATION" fileName="${sys:app.home}/logs/${sys:port.http}/application.log" filePattern="${sys:app.home}/logs/${sys:port.http}/application.log.%d{yyyy-MM-dd}">
            <PatternLayout pattern="%d %c %t%X{request}%X{url} %p %m%n%th{10}" charset="UTF-8"/>
            <TimeBasedTriggeringPolicy />
        </RollingFile>
        <RollingFile name="ERROR" fileName="${sys:app.home}/logs/${sys:port.http}/application-error.log" filePattern="${sys:app.home}/logs/${sys:port.http}/application-error.log.%d{yyyy-MM-dd}">
            <ThresholdFilter level="ERROR"/>
            <PatternLayout pattern="%d %c %t%X{request}%X{url} %p %m%n" charset="UTF-8"/>
            <TimeBasedTriggeringPolicy />
        </RollingFile>
    </Appenders>
</Configuration>
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
import org.junit.Test;
import java.util.List;

public class JacksonAttrXmlTest {

    static XmlMapper xmlMapper = new XmlMapper();

    static {
        xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
        xmlMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);
    }

    @Test
    public void test1() throws JsonProcessingException {
        String xml = "<Configuration shutdownHook=\"disable\" packages=\"org.ironrhino.core.log4j\">\n" +
                "    <Properties>\n" +
                "        <Property name=\"app.home\">/tmp/app</Property>\n" +
                "        <Property name=\"port.http\"></Property>\n" +
                "    </Properties>\n" +
                "    <Appenders>\n" +
                "        <Console name=\"CONSOLE\" target=\"SYSTEM_OUT\">\n" +
                "            <ThresholdFilter level=\"${sys:console.logger.level}\"/>\n" +
                "            <PatternLayout pattern=\"%style{%d %25.25t %60.60c{1.}}{cyan} %highlight{%p %m%n}\" noConsoleNoAnsi=\"true\"/>\n" +
                "        </Console>\n" +
                "        <File name=\"DEBUG\" fileName=\"${sys:app.home}/logs/${sys:port.http}/application-debug.log\">\n" +
                "            <PatternLayout pattern=\"%d %c %t%X{request}%X{url} %p %m%n%th{10}\" charset=\"UTF-8\"/>\n" +
                "        </File>\n" +
                "        <RollingFile name=\"APPLICATION\" fileName=\"${sys:app.home}/logs/${sys:port.http}/application.log\" filePattern=\"${sys:app.home}/logs/${sys:port.http}/application.log.%d{yyyy-MM-dd}\">\n" +
                "            <PatternLayout pattern=\"%d %c %t%X{request}%X{url} %p %m%n%th{10}\" charset=\"UTF-8\"/>\n" +
                "            <TimeBasedTriggeringPolicy />\n" +
                "        </RollingFile>\n" +
                "        <RollingFile name=\"ERROR\" fileName=\"${sys:app.home}/logs/${sys:port.http}/application-error.log\" filePattern=\"${sys:app.home}/logs/${sys:port.http}/application-error.log.%d{yyyy-MM-dd}\">\n" +
                "            <ThresholdFilter level=\"ERROR\"/>\n" +
                "            <PatternLayout pattern=\"%d %c %t%X{request}%X{url} %p %m%n\" charset=\"UTF-8\"/>\n" +
                "            <TimeBasedTriggeringPolicy />\n" +
                "        </RollingFile>\n" +
                "    </Appenders>\n" +
                "</Configuration>\n";
        Configuration configuration = xmlMapper.readValue(xml, Configuration.class);
        String s = xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(configuration);
        System.out.println(s);
        System.out.println(configuration);
    }
}


class Configuration{

    @JacksonXmlProperty(isAttribute = true)
    private String shutdownHook;

    @JacksonXmlProperty(isAttribute = true)
    private String packages;

    @JacksonXmlElementWrapper(localName = "Properties")
    @JacksonXmlProperty(localName = "Property")
    private List<Property> propertyList;
    @JacksonXmlProperty(localName = "Appenders")
    private Appender appender;


    public String getShutdownHook() {
        return shutdownHook;
    }

    public void setShutdownHook(String shutdownHook) {
        this.shutdownHook = shutdownHook;
    }

    public String getPackages() {
        return packages;
    }

    public void setPackages(String packages) {
        this.packages = packages;
    }

    public List<Property> getPropertyList() {
        return propertyList;
    }

    public void setPropertyList(List<Property> propertyList) {
        this.propertyList = propertyList;
    }

    public Appender getAppender() {
        return appender;
    }

    public void setAppender(Appender appender) {
        this.appender = appender;
    }

    static class Property {

        @JacksonXmlProperty(isAttribute = true)
        private String name;

        @JacksonXmlText
        private String value;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

    static class Appender{
        @JacksonXmlProperty(localName = "Console")
        private Console console;
        @JacksonXmlProperty(localName = "File")
        private File file;

        @JacksonXmlElementWrapper(useWrapping = false)
        @JacksonXmlProperty(localName = "RollingFile")
        private List<RollingFile> rollingFiles;

        public Console getConsole() {
            return console;
        }

        public void setConsole(Console console) {
            this.console = console;
        }

        public File getFile() {
            return file;
        }

        public void setFile(File file) {
            this.file = file;
        }

        public List<RollingFile> getRollingFiles() {
            return rollingFiles;
        }

        public void setRollingFiles(List<RollingFile> rollingFiles) {
            this.rollingFiles = rollingFiles;
        }

        static class Console{
            @JacksonXmlProperty(isAttribute = true)
            private String name;
            @JacksonXmlProperty(isAttribute = true)
            private String target;

            @JacksonXmlProperty(localName = "ThresholdFilter")
            private ThresholdFilter thresholdFilter;
            @JacksonXmlProperty(localName = "PatternLayout")
            private PatternLayout patternLayout;

            public PatternLayout getPatternLayout() {
                return patternLayout;
            }

            public void setPatternLayout(PatternLayout patternLayout) {
                this.patternLayout = patternLayout;
            }

            static class ThresholdFilter{
                @JacksonXmlProperty(isAttribute = true)
                private String level;

                public String getLevel() {
                    return level;
                }

                public void setLevel(String level) {
                    this.level = level;
                }
            }

            static class PatternLayout{
                @JacksonXmlProperty(isAttribute = true)
                private String pattern;
                @JacksonXmlProperty(isAttribute = true)
                private String noConsoleNoAnsi;
                @JacksonXmlProperty(isAttribute = true)
                private String charset;



                public String getPattern() {
                    return pattern;
                }

                public void setPattern(String pattern) {
                    this.pattern = pattern;
                }

                public String getNoConsoleNoAnsi() {
                    return noConsoleNoAnsi;
                }

                public void setNoConsoleNoAnsi(String noConsoleNoAnsi) {
                    this.noConsoleNoAnsi = noConsoleNoAnsi;
                }

                public String getCharset() {
                    return charset;
                }

                public void setCharset(String charset) {
                    this.charset = charset;
                }
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getTarget() {
                return target;
            }

            public void setTarget(String target) {
                this.target = target;
            }

            public ThresholdFilter getThresholdFilter() {
                return thresholdFilter;
            }

            public void setThresholdFilter(ThresholdFilter thresholdFilter) {
                this.thresholdFilter = thresholdFilter;
            }
        }

        static class File{
            @JacksonXmlProperty(isAttribute = true)
            private String name;
            @JacksonXmlProperty(isAttribute = true)
            private String fileName;

            @JacksonXmlProperty(localName = "PatternLayout")
            private Console.PatternLayout patternLayout;

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getFileName() {
                return fileName;
            }

            public void setFileName(String fileName) {
                this.fileName = fileName;
            }

            public Console.PatternLayout getPatternLayout() {
                return patternLayout;
            }

            public void setPatternLayout(Console.PatternLayout patternLayout) {
                this.patternLayout = patternLayout;
            }
        }

        static class RollingFile{
            @JacksonXmlProperty(localName = "PatternLayout")
            private Console.PatternLayout patternLayout;

            @JacksonXmlProperty(localName = "TimeBasedTriggeringPolicy")
            private TimeBasedTriggeringPolicy timeBasedTriggeringPolicy;

            @JacksonXmlProperty(localName = "ThresholdFilter")
            private Console.ThresholdFilter thresholdFilter;

            @JacksonXmlProperty(isAttribute = true)
            private String name;
            @JacksonXmlProperty(isAttribute = true)
            private String fileName;
            @JacksonXmlProperty(isAttribute = true)
            private String filePattern;


            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getFileName() {
                return fileName;
            }

            public void setFileName(String fileName) {
                this.fileName = fileName;
            }

            public String getFilePattern() {
                return filePattern;
            }

            public void setFilePattern(String filePattern) {
                this.filePattern = filePattern;
            }

            public Console.ThresholdFilter getThresholdFilter() {
                return thresholdFilter;
            }

            public void setThresholdFilter(Console.ThresholdFilter thresholdFilter) {
                this.thresholdFilter = thresholdFilter;
            }

            public Console.PatternLayout getPatternLayout() {
                return patternLayout;
            }

            public void setPatternLayout(Console.PatternLayout patternLayout) {
                this.patternLayout = patternLayout;
            }

            public TimeBasedTriggeringPolicy getTimeBasedTriggeringPolicy() {
                return timeBasedTriggeringPolicy;
            }

            public void setTimeBasedTriggeringPolicy(TimeBasedTriggeringPolicy timeBasedTriggeringPolicy) {
                this.timeBasedTriggeringPolicy = timeBasedTriggeringPolicy;
            }

            static class TimeBasedTriggeringPolicy{

            }
        }
    }
}