如何使用JAXB将空值表示为空元素? [英] How to represent null value as empty element with JAXB?
问题描述
我 XSD
结构是像下述: -
My XSD
structure is like the below:-
<element name="XYZDate" maxOccurs="1" minOccurs="1" nillable="true" type="date"/>
当我在此字段中设置空值时,它允许我,但在<$ c $时C> XML 从 JAXB
编组它产生与所述输出
When I set the null value in this field it allow me but at he time of XML
Generation from JAXB
marshaling it produce the output with
<XYZDate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
在结果中我希望输出为< XYZDate /> ;
即不想要架构和其他属性。
我在使用 XMLStreamWriter
的帮助下摆脱了这一点但是它在单行中生成完整的 XML
。我需要格式化良好的 XML
。
如果我需要使用 IndentingXMLStreamWriter
我的 Java
版本不支持它,我无法控制要更改或修改的Java容器。
Whereas in the result I want the out put as <XYZDate/>
i.e. do not want the schema and other attribute.
I get rid of this with the help of using XMLStreamWriter
but it produce the complete XML
in Single line. I need formatted well formed XML
.
If I need to use IndentingXMLStreamWriter
my Java
version do not support it and I do not have control over Java Container to change or modify.
请建议任何形式的解决方案 XML
格式良好。
Please suggest any solution to form XML
Well Formatted.
推荐答案
注意#1:我是EclipseLink JAXB(MOXy) 领导和 JAXB(JSR-222) 专家组。
NOTE #1: I am the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.
注意#2:您看到的输出与您使用JAXB映射的内容相匹配。有关详细信息,请参阅:
NOTE #2: The output that you are seeing matches what you have mapped with JAXB. For more information see:
- http://blog.bdoughan.com/2012/04/binding-to-json-xml-handling-null.html
将空值表示为空元素
如果你想将null表示为空元素,有几个选项。
If you want to represent null as an empty element, there are a couple of options.
选项#1 - 使用标准JAXB API
DateAdapter
DateAdapter
你可以使用 XmlAdapter
来更改 Date
的实例编组为XML的方式。我们将日期转换为一个类的实例,该类具有一个用 @XmlValue
映射的属性(参见http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html ) 。 JAXB RI不会为空值调用 XmlAdapter
机制,因此您需要使用像MOXy这样的JAXB impl。
You could use an XmlAdapter
to change the way an instance of Date
is marshalled to XML. We will convert the date to an instance of a class that has one property mapped with @XmlValue
(see http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html). The JAXB RI does not call the XmlAdapter
mechanism for null values, so you will need to use a JAXB impl that does such as 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;
}
}
Root
Root
使用 @XmlJavaTypeAdapter引用
注释。 XmlAdapter
The XmlAdapter
is referenced using the @XmlJavaTypeAdapter
annotation.
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
扩展,为您提供一些灵活性你代表null。
MOXy offers an @XmlNullPolicy
extension that gives you some flexibility in how you represent null.
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;
}
}
其他文件
以下文件可与任一选项一起使用以完成示例。
The following files can be used with either option to complete the example.
jaxb.properties
jaxb.properties
要将MOXy指定为您的JAXB提供程序,您需要包括一个所谓的 jaxb.properties
在同一封装具有下列条目域模型文件(参见: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html )。
To specify MOXy as your JAXB provider you need to include a file called jaxb.properties
in the same package as your domain model with the following entry (see: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html).
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
演示
Demo
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);
}
}
输出
Output
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>
这篇关于如何使用JAXB将空值表示为空元素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!