如何代表与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/>