我看到许多使用多个类来定义不同级别的属性的示例。我有很多元素需要在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")
答案 0 :(得分:0)
我认为您最好的方法是使用XmlAdapter。这是我根据对this tutorial的修改做的测试。
@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;
}
}
此适配器基本上将您的Map
转换为List<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>
现在唯一的问题是元素不是行或列而是条目!要改变它,我认为你需要创建两个适配器。
希望您觉得这很有帮助。