如何代表与JAXB空元素空值?(jaxb中引用@XmlNullPolicy仍然不能显示空节点)

如何代表与JAXB空元素空值?

 

java xml jaxb
我的 XSD 结构就像是如下:-
<element name="XYZDate" maxOccurs="1" minOccurs="1" nillable="true" type="date"/>
当我设置为空值在这一领域它,但在他的 XML 从代 JAXB 编组它产生的输出
<XYZDate xmlns:xsi=" CodeGo.net  xsi:nil="true"/>
而在结果我想出来把它作为 <XYZDate/> 即不希望的模式和其他属性。 我摆脱这种与帮助 XMLStreamWriter 但它产生 XML 在单线。我需要格式化好 XML 。 如果我需要 IndentingXMLStreamWriter 我的 Java 版本不支持的话,我不拥有控制权的Java容器来改变或修改。 请提出解决方案,形成 XML 以及格式化。
本文地址 :CodeGo.net/487355/ 
------------------------------------------------------------------------------------------------------------------------- 
1.  注1:我是JAXB的EclipseLink(MOXY)铅和JAXB(JSR-222)专家组。 注2:您看到的输出与你所映射的使用JAXB。对于见: 代表NULL作为一个空元素 如果你想表示空为空也有几个选项。 选项#1-使用标准的JAXB的API DateAdapter 你的 XmlAdapter 方式的转变的一个实例 Date 被编组为XML。我们将日期转换为具有一个属性类的映射与实例 @XmlValue (请参阅JAXB RI不会调用 XmlAdapter 机制空值,所以你需要一个JAXB的impl,做如MOXY。
package forum11743306;
import javax.xml.bind.annotation.XmlValue;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.datatype.XMLGregorianCalendar;
public class DateAdapter extends XmlAdapter<DateAdapter.AdaptedDate, XMLGregorianCalendar>{
 @Override
 public AdaptedDate marshal(XMLGregorianCalendar date) throws Exception {
  AdaptedDate adaptedDate = new AdaptedDate();
  adaptedDate.value = date;
  return adaptedDate;
 }
 @Override
 public XMLGregorianCalendar unmarshal(AdaptedDate adaptedDate) throws Exception {
  return adaptedDate.value;
 }
 public static class AdaptedDate {
  @XmlValue
  public XMLGregorianCalendar value;
 }
}
根 该 XmlAdapter @XmlJavaTypeAdapter 注解。
package forum11743306;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.datatype.XMLGregorianCalendar;
@XmlRootElement
public class Root {
 private XMLGregorianCalendar xyzDate;
 @XmlElement(name = "XYZDate", required=true, nillable = true)
 @XmlJavaTypeAdapter(DateAdapter.class)
 public XMLGregorianCalendar getXyzDate() {
  return xyzDate;
 }
 public void setXyzDate(XMLGregorianCalendar xyzDate) {
  this.xyzDate = xyzDate;
 }
}
选项#2-使用MOXY的@XmlNullPolicy扩展 MOXY提供 @XmlNullPolicy 扩展,让你在你如何表示空的灵活性。
package forum11743306;
import javax.xml.bind.annotation.*;
import javax.xml.datatype.XMLGregorianCalendar;
import org.eclipse.persistence.oxm.annotations.*;
@XmlRootElement
public class Root {
 private XMLGregorianCalendar xyzDate;
 @XmlElement(name = "XYZDate", required=true, nillable = true)
 @XmlNullPolicy(emptyNodeRepresentsNull = true, nullRepresentationForXml = XmlMarshalNullRepresentation.EMPTY_NODE)
 public XMLGregorianCalendar getXyzDate() {
  return xyzDate;
 }
 public void setXyzDate(XMLGregorianCalendar xyzDate) {
  this.xyzDate = xyzDate;
 }
}
其他文件 下列文件可以与任一选项的例子。 jaxb.properties 要指定MOXY为您的JAXB提供者需要包含一个名为 jaxb.properties 在封装与下列项目的域模型(见:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
演示
package forum11743306;
import javax.xml.bind.*;
import javax.xml.datatype.DatatypeFactory;
import org.eclipse.persistence.Version;
public class Demo {
 public static void main(String[] args) throws Exception {
  JAXBContext jc = JAXBContext.newInstance(Root.class);
  System.out.println(Version.getVersion());
  System.out.println(jc.getClass());
  Marshaller marshaller = jc.createMarshaller();
  marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  Root root = new Root();
  root.setXyzDate(null);
  marshaller.marshal(root, System.out);
  root.setXyzDate(DatatypeFactory.newInstance().newXMLGregorianCalendar("2012-08-01"));
  marshaller.marshal(root, System.out);
 }
}
yield
2.4.0
class org.eclipse.persistence.jaxb.JAXBContext
<?xml version="1.0" encoding="UTF-8"?>
<root>
 <XYZDate/>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
 <XYZDate>2012-08-01</XYZDate>
</root>

2.  你应该读为nillable和XSD属性之间的区别 nil empty 是显著 XML 。即 xsi:nil=true 类似于 SQL NULL 但有空白表示空的礼物:) 我知道这是 为了解决您的具体问题,如果你 JAXB 序列化来产生,我阅读如何实例化一个空的使用JAXB。这个问题本身就说明你如何生成一个空 
3.  我投了gbvb的答案。 我不明白你为什么要这样,但。 空与 xmlns:xsi xsi:nil 是正确的道路要走。 如果没有这些属性的任何 reasonable 解析器会给你空字符串 even if the element is self-closed 。 说 CodeGo.net,你想给客户端一个整数值的最高分在许多玩家的分数。 当你可以计算你可以给出正确的值。 当没有球员究竟是谁打进的是,你应该正确的价值为 NULL nil 没有记录累积。
<highestScore among="128">98</highestScore>
可以说得分最高的是128的尝试98。 和
<highestScore among="0"
    xmlns:xsi=" CodeGo.net 
    xsi:nil="true"/>
可以说,没有最高分是没有记录的分数。 但
<highestScore/>
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值