1

I want to add another new attributes the an field without changing the java object.

<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;
}

If I want to add a new attribute 4 to the XMLwithout changing the Field class(adding new field to the class and recompile).

Is there a way to do that?

0

1 Answer 1

1

If your want the Java class to be able to store any attribute, you need a Map to store the attribute name/value pairs, and you need to annotate that field with @XmlAnyAttribute.

Here is example code:

@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;
}

Test

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);

Output

field.attribute1 = A
field.attribute2 = B
field.attribute3 = C
field.attributes = {attribute4=D, foo=Bar}

As you can see, the two "extra" attributes were added to the map.

If you run the same test but without any attributes, i.e. with xml = "<field/>";, you get:

field.attribute1 = null
field.attribute2 = null
field.attribute3 = null
field.attributes = null

The attributes field is left unassigned, i.e. null. It is not an empty map.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.