Javaクラスで任意の属性を格納できるようにするには、属性名と値のペアを格納するためにMap
が必要で、そのフィールドに@XmlAnyAttribute
という注釈を付ける必要があります。ここで
は例のコードは次のとおりです。
@XmlRootElement(name = "field")
@XmlAccessorType(XmlAccessType.FIELD)
public class Field {
@XmlAttribute(name="attribute1")
String attribute1;
@XmlAttribute(name="attribute2")
String attribute2;
@XmlAttribute(name="attribute3")
String attribute3;
@XmlAnyAttribute
Map<String, String> attributes;
}
テスト
String xml = "<field attribute1=\"A\"" +
" attribute2=\"B\"" +
" attribute3=\"C\"" +
" attribute4=\"D\"" +
" foo=\"Bar\" />";
JAXBContext jaxbContext = JAXBContext.newInstance(Field.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Field field = (Field) unmarshaller.unmarshal(new StringReader(xml));
System.out.println("field.attribute1 = " + field.attribute1);
System.out.println("field.attribute2 = " + field.attribute2);
System.out.println("field.attribute3 = " + field.attribute3);
System.out.println("field.attributes = " + field.attributes);
出力
field.attribute1 = A
field.attribute2 = B
field.attribute3 = C
field.attributes = {attribute4=D, foo=Bar}
あなたが見ることができるように、2つの "余分な" 属性が追加されました地図。
あなたはxml = "<field/>";
で、すなわち、同じテストを実行しますが、任意の属性なしている場合、あなたが得る:
field.attribute1 = null
field.attribute2 = null
field.attribute3 = null
field.attributes = null
attributes
フィールドはすなわちnull
、未割り当てのままにされます。それは空の地図ではありません。
は私にとって非常にうまく機能します。 – raccoon