代码之家  ›  专栏  ›  技术社区  ›  doekman

如何用JAXB实例化空元素

  •  9
  • doekman  · 技术社区  · 15 年前

    我使用JAXB创建XML消息。我需要创建的XML是(为了简单起见):

    <request>
      <header/>
    </request>
    

    import javax.xml.bind.annotation.*;
    
    @XmlRootElement(name = "request")
    public class Request {
    
        private String header;
    
        @XmlElement(required=true)
        public String getHeader() {
          return header;
        }
    
        public void setHeader(String header) {
          this.header=header;
        }
    }
    

    header 元素不显示(标题为 null )。当标题设置为空字符串时,将显示以下内容:

    <request>
      <header></header>
    </request>
    

    当我使用 Object 而不是 String

    <request>
      <header xsi:type="xs:string" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></header>
    </request>
    

    顺便说一句:我正在使用 this code

    有可能得到一个空标签吗?

    4 回复  |  直到 7 年前
        1
  •  12
  •   Tom Hawtin - tackline    15 年前

    在XML中, <header/> <header></header> 都是一样的。如果你真的想要前者,那就用美容剂。 javax.xml.transform.TransformerFactory.newTransformer()

        2
  •  4
  •   Chris Dail    15 年前

    字符串对象的空标记本质上就是空字符串。

    如果您拨打以下电话,您将得到您想要的:

    request.setHeader("")
    

    <header></header>
    
    <header/>
    
        3
  •  2
  •   informatik01 Viswanath Lekshmanan    11 年前

    正如@Tom Hawtin-tackline所说

    <header/> <header></header>

    你必须把 nillable

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

    我希望这段代码将为 null 价值

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

    印刷品

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <request>
        <header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    </request>
    
        4
  •  0
  •   Mark D    9 年前

    实际上,我也想要同样的东西 <header/> <header></header>

    由于空值(而不是空字符串)将生成正确的结果,因此我修改了setter方法,将值显式设置为空:

    public void setHeader(String header) {
        this.header = "".equals(header) ? null : header;
    }