gpt4 book ai didi

java - 如何使用 JAXB 将 null 值表示为空元素?

转载 作者:行者123 更新时间:2023-12-02 01:01:20 26 4
gpt4 key购买 nike

我的XSD结构如下:-

<element name="XYZDate" maxOccurs="1" minOccurs="1" nillable="true" type="date"/>

当我在此字段中设置空值时,它允许我,但在 XML 的时间一代来自 JAXB编码它产生输出

<XYZDate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>

而在结果中我希望输出为 <XYZDate/>即不需要架构和其他属性。
我在使用 XMLStreamWriter 的帮助下摆脱了这个问题但它产生完整的 XML在单行中。我需要格式良好的 XML 。如果我需要使用IndentingXMLStreamWriter我的Java版本不支持它,并且我无法控制 Java 容器来更改或修改。

请向表格 XML 提出任何解决方案格式良好。

最佳答案

注意#1:我是 EclipseLink JAXB (MOXy) JAXB (JSR-222) 的领导者和成员专家组。

<小时/>

注意#2:您看到的输出与您使用 JAXB 映射的输出相匹配。欲了解更多信息,请参阅:

<小时/>

将 NULL 表示为空元素

如果您想将 null 表示为空元素,有几个选项。

选项 #1 - 使用标准 JAXB API

日期适配器

您可以使用XmlAdapter 来更改Date 实例编码为XML 的方式。我们将把日期转换为一个类的实例,该类具有一个用 @XmlValue 映射的属性(请参阅 http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html )。 JAXB RI 不会针对 null 值调用 XmlAdapter 机制,因此您需要使用 MOXy 等执行此操作的 JAXB impl。

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

}

使用 @XmlJavaTypeAdapter 注释引用 XmlAdapter

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。

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 的文件,其中包含以下条目(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。

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

}

输出

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>

关于java - 如何使用 JAXB 将 null 值表示为空元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57767211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com