栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java / JAXB:将XML属性解组为特定的Java对象属性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java / JAXB:将XML属性解组为特定的Java对象属性

怎么样?

介绍一个称为选项的通用超类:

import javax.xml.bind.annotation.XmlAttribute;public abstract class Options {    private String name;    @XmlAttribute    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

然后在带有选项列表的类(在本示例中为Configuration)上,在该属性上指定一个@XmlJavaTypeAdapter:

import java.util.ArrayList;import java.util.List;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;@XmlRootElementpublic class Configuration {    private List<Options> section = new ArrayList<Options>();    @XmlJavaTypeAdapter(OptionsAdapter.class)    public List<Options> getSection() {        return section;    }    public void setSection(List<Options> section) {        this.section = section;    }}

XmlAdapter看起来像这样:

import javax.xml.bind.annotation.adapters.XmlAdapter;public class OptionsAdapter extends XmlAdapter<AdaptedOptions, Options> {    @Override    public Options unmarshal(AdaptedOptions v) throws Exception {        if("default_options".equals(v.name)) { DefaultOptions options = new DefaultOptions(); options.setName(v.getName()); options.setDefaultPort(Integer.valueOf(v.map.get("default_port"))); options.setLogLevel(v.map.get("log_level")); return options;        } else { CustomOptions options = new CustomOptions(); options.setName(v.getName()); options.setCompatibility(v.map.get("compatibility")); options.setMemory(v.map.get("memory")); return options;        }    }    @Override    public AdaptedOptions marshal(Options v) throws Exception {        AdaptedOptions adaptedOptions = new AdaptedOptions();        adaptedOptions.setName(v.getName());        if(DefaultOptions.class == v.getClass()) { DefaultOptions options = (DefaultOptions) v; adaptedOptions.map.put("default_port", String.valueOf(options.getDefaultPort())); adaptedOptions.map.put("log_level", options.getLogLevel());        } else { CustomOptions options = (CustomOptions) v; adaptedOptions.map.put("compatibility", options.getCompatibility()); adaptedOptions.map.put("memory", options.getMemory());        }        return adaptedOptions;    }}

AdaptedOptions看起来像:

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlValue;public class AdaptedOptions extends Options {    @XmlAttribute String name;    @XmlElement List<Value> value = new ArrayList<Value>();    Map<String, String> map = new HashMap<String, String>();    public void beforeMarshal(Marshaller marshaller) {        for(Entry<String, String> entry : map.entrySet()) { Value aValue = new Value(); aValue.name = entry.getKey(); aValue.value = entry.getValue(); value.add(aValue);        }    }    public void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {        for(Value aValue : value) { map.put(aValue.name, aValue.value);        }    }    private static class Value {        @XmlAttribute String name;        @XmlValue String value;    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/486657.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号