gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:31:13 30 4
gpt4 key购买 nike

我的 XSD结构如下:-

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

当我在此字段中设置 null 值时,它允许我但在 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 不会为空值调用 XmlAdapter 机制,因此您需要使用 JAXB 实现,例如 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;
}

}

使用 @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 将空值表示为空元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11743306/

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