【问题标题】:Using JAXB to create XML from MAP使用 JAXB 从 MAP 创建 XML
【发布时间】:2017-01-27 12:22:13
【问题描述】:

我想从 Java.util.Map 创建 XML 我将值放入该映射并尝试创建 XML,哪个根元素将是可配置的,并且将从该映射创建子元素。

 Map mp = new HashMap(); 

  mp.put("key","shaon"):

  mp.put("newKey","newValue");

XML 会是这样的:

<shaonsXML>
  <key>shaon</key>
  <newKey> newValue </newKey>
</shaonsXML>

我见过使用 JAXB 的示例,但这些示例并没有像我尝试生成的那样创建 XML 标记。

谁能给我一些链接或建议?提前致谢!

我已遵循这些建议:thisthis

但它会生成这个 XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <mapProperty>
        <item>
            <key>KEY1</key>
            <value>SHAON</value>
        </item>
        <item>
            <key>newKEY</key>
            <value>newValue</value>
        </item>
    </mapProperty>
</root>

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    我做到了!使用this 示例

    从上面的帖子:创建了这个类:

        public class MapAdapter extends XmlAdapter<MapWrapper, Map<String, String>>{
    
        @Override
        public Map<String, String> unmarshal(MapWrapper v) throws Exception {
            Map<String, String> map = new HashMap<String,String>();//v.toMap();
    
            return map;
        }
    
        @Override
        public MapWrapper marshal(Map<String, String> m) throws Exception {
            MapWrapper wrapper = new MapWrapper();
    
            for(Map.Entry<String, String> entry : m.entrySet()){
                 wrapper.addEntry(new JAXBElement<String>(new QName(entry.getKey()), String.class, entry.getValue()));
            }
    
            return wrapper;
        }
    
    }
    

    MapWrapper 类:

    @XmlType
    public class MapWrapper{
        private List<JAXBElement<String>> properties = new ArrayList<>();
    
        public MapWrapper(){
    
        }
    
        @XmlAnyElement
        public List<JAXBElement<String>> getProperties() {
            return properties;
        }
        public void setProperties(List<JAXBElement<String>> properties) {
            this.properties = properties;
        }
        public void addEntry(JAXBElement<String> prop){
            properties.add(prop);
        }
    
        public void addEntry(String key, String value){
            JAXBElement<String> prop = new JAXBElement<String>(new QName(key), String.class, value);
            addEntry(prop);
        }
    
    }
    

    创建了这个自定义地图

    @XmlRootElement(name="RootTag")
    public class CustomMap extends MapWrapper{
        public CustomMap(){
    
        }
    }
    

    通过创建 XML 测试代码:

    private static void writeAsXml(Object o, Writer writer) throws Exception
      {
        JAXBContext jaxb = JAXBContext.newInstance(o.getClass());
    
        Marshaller xmlConverter = jaxb.createMarshaller();
        xmlConverter.setProperty("jaxb.formatted.output", true);
        xmlConverter.marshal(o, writer);
      }
    
    
    CustomMap map = new CustomMap();
        map.addEntry("Key1","Value1");
        map.addEntry("Key2","Value2");
        map.addEntry("Key3","Value3");
        map.addEntry("Key4","Value4");
        writeAsXml(map, new PrintWriter(System.out));
    

    并生成XML:

    <RootTag>
        <Key1>Value1</Key1>
        <Key2>Value2</Key2>
        <Key3>Value3</Key3>
        <Key4>Value4</Key4>
    </RootTag>
    

    我只需要 Marshaling 所以没有实现 Unmarshal 部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-24
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多