jackson处理标签中带属性的xml
用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 = null;
static {
xmlMapper = new XmlMapper();
// 反序列化时,有未知属性(没有对应字段名或者set方法或handler)是否抛异常 false:不抛异常
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
// 序列化时,有空对象是否报错 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{
// isAttribute 标识该字段是否为标签属性
@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{
}
}
}
}