Adding an Attribute to a JAXB Element

I am struggling with some JAXB parsing and need guidance.

Essentially, I'm trying to add attributes to my class variables, which I have already declared as Elements using @XmlElement. So far, any attempt to use @XmlAttribute has set the attribute at the class level.

I am currently getting the following:

<DataClass newAttribute="test"> <myElement>I wish this element had an attribute</myElement> <anotherElement>I wish this element had an attribute too</anotherElement> </DataClass> 

I would like to do this:

 <DataClass> <myElement thisAtt="this is what I'm talking about">This is better</myElement> <anotherElement thisAtt="a different attribute here">So is this</anotherElement> </DataClass> 

I saw that other posts add an attribute to a single element using @XmlValue, but this does not work when you have elements, and will not work with multiple elements.

Does anyone have a thought on how to do this?

Thanks! Jason

+6
source share
2 answers

This will create the XML:

 public class JaxbAttributes { public static void main(String[] args) throws Exception { Marshaller marshaller = JAXBContext.newInstance(DataClass.class).createMarshaller(); StringWriter stringWriter = new StringWriter(); DataClass dataClass = new DataClass( new Foo("this is what I'm talking about", "This is better"), new Foo("a different attribute here", "So is this")); marshaller.marshal(dataClass, stringWriter); System.out.println(stringWriter); } @XmlRootElement(name = "DataClass") @XmlType(propOrder = {"myElement", "anotherElement"}) static class DataClass { private Foo myElement; private Foo anotherElement; DataClass() {} public DataClass(Foo myElement, Foo anotherElement) { this.myElement = myElement; this.anotherElement = anotherElement; } public Foo getMyElement() { return myElement; } public void setMyElement(Foo myElement) { this.myElement = myElement; } public Foo getAnotherElement() { return anotherElement; } public void setAnotherElement(Foo anotherElement) { this.anotherElement = anotherElement; } } static class Foo { private String thisAtt; private String value; Foo() {} public Foo(String thisAtt, String value) { this.thisAtt = thisAtt; this.value = value; } @XmlAttribute public String getThisAtt() { return thisAtt; } public void setThisAtt(String thisAtt) { this.thisAtt = thisAtt; } @XmlValue public String getValue() { return value; } public void setValue(String value) { this.value = value; } } } 
+3
source

Note. I am the lead EclipseLink JAXB (MOXy) and member of the JAXB 2. X ( JSR-222 ) expert group.

Alternatively, you can use the @XmlPath extension in MOXy to handle this use case:

Dataclass

The @XmlPath can be used with standard JAXB annotations:

 import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import org.eclipse.persistence.oxm.annotations.XmlPath; @XmlRootElement(name="DataClass") @XmlType(propOrder={"myElement", "anotherElement"}) public class DataClass { private String myElement; private String myElementThisAtt; private String anotherElement; private String anotherElementThisAtt; public String getMyElement() { return myElement; } public void setMyElement(String myElement) { this.myElement = myElement; } @XmlPath("myElement/@thisAtt") public String getMyElementThisAtt() { return myElementThisAtt; } public void setMyElementThisAtt(String myElementThisAtt) { this.myElementThisAtt = myElementThisAtt; } public String getAnotherElement() { return anotherElement; } public void setAnotherElement(String anotherElement) { this.anotherElement = anotherElement; } @XmlPath("anotherElement/@thisAtt") public String getAnotherElementThisAtt() { return anotherElementThisAtt; } public void setAnotherElementThisAtt(String anotherElementThisAtt) { this.anotherElementThisAtt = anotherElementThisAtt; } } 

Demo

 import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(DataClass.class); DataClass dataClass = new DataClass(); dataClass.setMyElement("This is better"); dataClass.setMyElementThisAtt("this is what I'm talking about"); dataClass.setAnotherElement("So is this"); dataClass.setAnotherElementThisAtt("a different attribute here"); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(dataClass, System.out); } } 

Exit

 <?xml version="1.0" encoding="UTF-8"?> <DataClass> <myElement thisAtt="this is what I'm talking about">This is better</myElement> <anotherElement thisAtt="a different attribute here">So is this</anotherElement> </DataClass> 

Additional Information

+2
source

Source: https://habr.com/ru/post/893217/


All Articles