如何在 JAXB 中生成 xml 时为空值生成 xml 单个空标记
How to generate xml single empty tag for null values while generating xml in JAXB
我正在尝试使用 JAXB 生成 xml 在将对象转换为 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>
如您所知,<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>
我正在尝试使用 JAXB 生成 xml 在将对象转换为 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>
如您所知,<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>