如何在JAXB中生成xml时为空值生成xml单个空标记

时间:2019-05-18 05:46:57

标签: java jaxb

我正在尝试使用JAXB生成xml,同时将对象转换为NULL值的xml时,它会出现双重空标记,例如:

<tag></tag>

但是我想要这个输出:

</tag>

我尝试了

@XmlElement(nillable = true)
private String VoyageID;

但是输出是这样的:

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

我不希望使用空策略描述。 只需要此输出:

但是我试图删除多余的信息xmlns:xsi,但是我无法使其工作。我也尝试过使用package-info.java,但是该命名空间url出现在xml的根元素之上。

<VesselDetails>
            <OceanCarrier Code="">
                <Vesselname></Vesselname>
                <VoyageId></VesselVoyageId>
                <PortofEntry></PortofEntry>
            </OceanCarrierSCAC>
<VesselDetails/>

我想要如下输出:

<VesselDetails>
<OceanCarrier Code=" ">
<Vesselname/>
<VoyageId/>
<PortofEntry/>
</OceanCarrierSCAC>
</VesselDetails>

1 个答案:

答案 0 :(得分:1)

如您所知,<Vesselname/><Vesselname></Vesselname>是相同的。 但是如果您确实想要预期的输出,我认为您需要javax.xml.transform.TransformerFactory.newTransformer()

我没有您的代码示例,所以我创建了一次。 您可以测试以下代码吗?

final VesselDetails someObj = new VesselDetails();
final JAXBContext context = JAXBContext.newInstance(VesselDetails.class);
final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
StringWriter inputWriter = new StringWriter();
marshaller.marshal(someObj, inputWriter);

Source source = new StreamSource(new StringReader(inputWriter.toString()));
Writer resultWriter = new StringWriter();
Result res = new StreamResult(resultWriter);

TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.transform(source, res);

System.out.println(resultWriter.toString());

输出:

<VesselDetails>
    <OceanCarrier>
        <Vesselname/>
        <VoyageID/>
        <PortofEntry/>
    </OceanCarrier>
</VesselDetails>