How to instantiate an empty element with JAXB

前端 未结 4 1447
-上瘾入骨i
-上瘾入骨i 2020-12-10 04:30

I use JAXB to create XML messages. The XML I need to create is (for the sake of simplicity):


  
相关标签:
4条回答
  • 2020-12-10 04:56

    An empty tag for a String object is essentially the empty string.

    If you call the following, you will get what you are looking for:

    request.setHeader("")
    

    I should also note that in XML the following two declarations of a header are idential. Both of these have no child text nodes. These are essentially the same and will be treated the same by all XML parsers:

    <header></header>
    
    <header/>
    
    0 讨论(0)
  • 2020-12-10 04:57

    As @Tom Hawtin - tackline said

    <header/> and <header></header> is same. Parsers will give you "".

    You have to to put nillable on your header annotation

    @XmlElement(nillable=true, required=true)
    public String getHeader() {
      return header;
    }
    

    I hope this code will generate following XML for null value.

    import javax.xml.bind.*;
    import javax.xml.bind.annotation.*;
    
    @XmlRootElement
    public class Request {
    
        public static void main(String[] args) throws JAXBException {
            final Request request = new Request();
            final JAXBContext context = JAXBContext.newInstance(Request.class);
            final Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                                   Boolean.TRUE);
            marshaller.marshal(request, System.out);
            System.out.flush();
        }
    
        @XmlElement(nillable=true, required=true)
        private String header;
    }
    

    prints

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <request>
        <header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    </request>
    
    0 讨论(0)
  • 2020-12-10 04:59

    In XML, <header/> and <header></header> are the same thing. If you really want the former, then use a prettifier. javax.xml.transform.TransformerFactory.newTransformer() will probably do that for you.

    0 讨论(0)
  • 2020-12-10 05:06

    I wanted the same thing, effectively <header/> rather than <header></header> during the xml serialization process.

    Since a null value - rather than an empty string - will produce the correct result, I modified my setter method to set the value explicitly to null:

    public void setHeader(String header) {
        this.header = "".equals(header) ? null : header;
    }
    
    0 讨论(0)
提交回复
热议问题