2017-12-07 16 views
1

Javaの オブジェクトを変更せずに、別の新しい属性をフィールドに追加したいとします。 Javaオブジェクトを変更せずに動的に属性を追加する

<field attribute1 = "1" attribute2 = "2" attribute3 = "3"> value</filed> 

@XmlRootElement(name = "field ") 
public class Field 
{ 
    @XmlAttribute(name="attribute1") 
    private String attribute1; 

    @XmlAttribute(name="attribute2") 
    private String attribute2; 

    @XmlAttribute(name="attribute3") 
    private String attribute3; 
} 

私はFieldクラスを変更XMLwithoutに新しい属性4を追加したい場合は

(クラスに新しいフィールドを追加して再コンパイル)。

これを行う方法はありますか?

答えて

1

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、未割り当てのままにされます。それは空の地図ではありません。

+0

は私にとって非常にうまく機能します。 – raccoon