0

我看到了许多使用多个类来定义不同级别的属性的示例。我有很多元素需要在 XML 中添加一个额外的条目,因此为此有很多文件是有意义的。我的总体主要目标是向现有类添加更多数据。

我正在尝试改变这一点

<definition>
  <rows>
    <row>1</row>
  </rows>
  <columns>
    <column>2</column>
  </columns>

修改(更改)或向每个条目添加属性。我在地图中有这些值(1 = Test1)。我正在尝试做这样的事情。

<definition>
<rows>
    <row name="Test1">1</row>
</rows>
<columns>
    <column name="Test2">2</column>
</columns>

或这个(唯一的问题是我将这些行/列存储为源中的整数,并且名称将采用字符串格式)

<definition>
<rows>
    <row>Test1</row>
</rows>
<columns>
    <column>Test2</column>
</columns>

这是我目前在java中拥有的。

public class Definition{    
    @XmlElementWrapper(name="rows")
    @XmlElement(name="row")
    @XmlElement (name="row_names")
    ...
    @XmlElementWrapper(name="cols")
    @XmlElement(name="col")
    @XmlElement (name="col_names")
4

1 回答 1

0

我认为您最好的方法是使用 XmlAdapter。这是我根据本教程的修改所做的测试。

定义类

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Definition {

    @XmlJavaTypeAdapter(MapAdapter.class)
    private Map<String,String> columns;

    @XmlJavaTypeAdapter(MapAdapter.class)
    private Map<String,String> rows;

    public Map<String,String> getColumns() {
        if (columns == null)
            columns = new HashMap<String,String>();
        return columns;
    }

    public Map<String,String> getRows() {
        if (rows == null)
            rows = new HashMap<String,String>();
        return rows;
    }

}

地图适配器

public class MapAdapter extends XmlAdapter<MapAdapter.AdaptedMap, Map<String, String>> {

    public static class AdaptedMap {
        public List<Entry> entry = new ArrayList<Entry>();
    }

    public static class Entry {

        @XmlAttribute
        public String name;

        @XmlValue
        public String value;

    }

    @Override
    public Map<String, String> unmarshal(AdaptedMap adaptedMap) throws Exception {
        Map<String, String> map = new HashMap<String, String>();
        for(Entry entry : adaptedMap.entry) {
            map.put(entry.name, entry.value);
        }
        return map;
    }

    @Override
    public AdaptedMap marshal(Map<String, String> map) throws Exception {
        AdaptedMap adaptedMap = new AdaptedMap();
        for(Map.Entry<String, String> mapEntry : map.entrySet()) {
            Entry entry = new Entry();
            entry.name = mapEntry.getKey();
            entry.value = mapEntry.getValue();
            adaptedMap.entry.add(entry);
        }
        return adaptedMap;
    }

}

基本上这个适配器,将你转换MapList<Entry>. 注意类中的注释Entry,这可以帮助您创建所需的结构。

测试的主要方法

public static void main(String[] args) throws JAXBException {
    JAXBContext context = JAXBContext.newInstance(Definition.class);

    Definition d = new Definition();
    d.getColumns().put("Test1","1");
    d.getRows().put("Test2", "2");

    Marshaller m = context.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    m.marshal(d, System.out);

}

结果

<definition>
    <columns>
        <entry name="Test1">1</entry>
    </columns>
    <rows>
        <entry name="Test2">2</entry>
    </rows>
</definition>

现在唯一的问题是元素不称为行或列,而是条目!要改变这一点,我认为您需要创建两个适配器。

希望你觉得这很有帮助。

于 2013-10-02T09:52:46.313 回答