具有可自定义元素名称的XmlAdapter

时间:2018-09-21 20:45:31

标签: java xml jaxb

我为名为XmlAdapter的类编写了一个MultiValuedProperties,该类本质上是一个不区分大小写的键的<String, List<String>>。当在各种JAXB对象中包含此XmlAdapter时,键/值元素有时称为“属性”,而不是“属性”。允许具有此类作为字段的对象指定其元素被调用的最简单方法是什么?

public class MultiValuedPropertiesJAXBAdapter extends XmlAdapter<MultiValuedPropertiesJAXBAdapter.MVPType, MultiValuedProperties> {

    public static class MVPType {
        @XmlElement(name="property")
        List<MVPTypeEntry> entries = new ArrayList<>();

        public boolean add(String key, String value) {
            MVPTypeEntry entry = new MVPTypeEntry(key, value);
            return entries.add(entry);
        }
    }

    @AllArgsConstructor
    public static class MVPTypeEntry {
        @XmlAttribute
        String key   = null;
        @XmlValue
        String value = null;
    }

    @Override
    public MultiValuedProperties unmarshal(MultiValuedPropertiesJAXBAdapter.MVPType type) throws Exception {
        if (type == null)
            return null;
        MultiValuedProperties props = new MultiValuedProperties();
        type.entries.forEach((entry) -> props.add(entry.key, entry.value));
        return props;
    }

    @Override
    public MultiValuedPropertiesJAXBAdapter.MVPType marshal(MultiValuedProperties mvp) throws Exception {
        if (mvp == null)
            return null;
        MVPType type = new MVPType();
        mvp.forEach((key, values) -> {
            if (values != null)
                values.forEach((value) -> type.add(key, value));
        });
        return type;
    }
}

用法示例:

public class Foo {
    @XmlElement
    @XmlJavaTypeAdapter(MultiValuedPropertiesJAXBAdapter.class)
    public MultiValuedProperties getAttributes();
}

我想要的是:

<foo>
  <attributes>
    <attribute key"somekey1">somevalue1</attribute>
    <attribute key"somekey2">somevalue2</attribute>
  </attributes>
</foo>

因此,对于此特定类Foo,最里面的元素称为“属性”,而不是“属性”。我希望可以在JAXB批注中找到一种简单的方法来完成此操作,但是我找不到它...谢谢您的帮助!

0 个答案:

没有答案