How to generate end tag for empty element in XML using JAXB

10,987

If you have generated Classes from XSD then you would also generated ObjectFactory class. If don't please refer here about how to generate ObjectFactory class.

After that, your code would be like--

JAXBContext context;
            context = JAXBContext.newInstance(*yourClass*.class);

final ObjectFactory objFactory = new ObjectFactory();

            final JAXBElement<YourClass> element = objFactory
                    .*autoGeneratedmethodfromObjectFactorytogetelement*;

Marshaller marshaller;
            marshaller = context.createMarshaller();

            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                    Boolean.TRUE);
            final StringWriter stringWriter = new StringWriter();


            marshaller.marshal(element, stringWriter);
          String message = stringWriter.toString();

This will give you desired output.

Share:
10,987
Rajesh Narravula
Author by

Rajesh Narravula

Java Professional

Updated on June 04, 2022

Comments

  • Rajesh Narravula
    Rajesh Narravula almost 2 years

    I'm generating XML using JAXB. But JAXB is generating an empty Tag closing it self. But my client want separate empty tag. I know both are equals but he is not agree with me. please any one suggest the solution. Thanks.

    Sample code:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "currencyCode",
        "discountValue",
        "setPrice",
        "spendLowerThreshold",
        "spendUpperThreshold",
        "discountApportionmentPercent",
        "discountApportionmentValue"
    })
    @XmlRootElement(name = "countryData")
    public class CountryData {
        protected String currencyCode;
        protected String discountValue = "";
        protected String setPrice = "";
        protected String spendLowerThreshold = "";
        protected String spendUpperThreshold = "";
        protected String discountApportionmentPercent = "";
        protected String discountApportionmentValue = "";
    
        // Setters and Gettres
    }
    

    Actual Output:

    <currencyCode>GBP</currencyCode>
    <discountValue/>
    <setPrice/>
    <spendLowerThreshold/>
    <spendUpperThreshold/>
    <discountApportionmentPercent>0.0</discountApportionmentPercent>
    <discountApportionmentValue/>
    

    Expected Output:

    <currencyCode>GBP</currencyCode>
    <discountValue></discountValue>
    <setPrice></setPrice>
    <spendLowerThreshold></spendLowerThreshold>
    <spendUpperThreshold></spendUpperThreshold>
    <discountApportionmentPercent>0.0</discountApportionmentPercent>
    <discountApportionmentValue></discountApportionmentValue>
    

    Code for Marshalling:

    try {
        Marshaller marshaller = JAXBContext.newInstance(CountryData.class).createMarshaller();
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        marshaller.marshal(countryData , os);
        log.debug("The PPV request raw XML -> " + os.toString());
    } catch (JAXBException e) {
        // nothing to do
    }
    

    I'm Using JDK 6.0