如何使用jaxb marshaller避免空标记?
final Marshaller marshaller = JAXBContext.newInstance(content.getClass()).createMarshaller();
final ByteArrayOutputStream stream = new ByteArrayOutputStream();
final XMLStreamWriter streamWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(stream);
final CapitalizedXMLStreamWriter xmlStreamWriter = new CapitalizedXMLStreamWriter(streamWriter);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocation);
marshaller.setAdapter(new NullAdapter());
marshaller.marshal(content, xmlStreamWriter);
xmlStreamWriter.flush();
xmlStreamWriter.close();
final String xml = new String(stream.toByteArray());
CapitalizedXMLStreamWriter
是我的作者,StreamWriterDelegate
。它只会将writeStartElement
覆盖为this.mDelegate.writeStartElement(arg0, capitalize(arg1));
我在package-info中使用注释来命名空间。
我尝试使用marshaller.setAdapter()
,但没有任何事情发生。
答案 0 :(得分:1)
我找不到一种全局方法来完全删除空标签(除了在序列化之前未在pojo中设置属性之外),但是如果您想将所有空字符串都转换为null即从<tagA></tagA>
到{{ 1}},您可以按以下方式使用<tagA/>
类;
第1步
扩展XmlAdapter
XmlAdapter
步骤2: 在pojo上应用:您可以采用不同的方法来应用它,但是全局方法之一是创建一个package-info.java文件,如下所示(无论您的pojo位于何处,它都将被打包)
package com.xyz.mylib;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class EmptyValueCleanerXmlAdapter extends XmlAdapter<String, String> {
@Override
public String unmarshal(String value) {
return value;
}
@Override
public String marshal(String value) {
return (value != null && value.length() == 0) ? null : value;
}
}
编辑:替代解决方案
我最终在xml上使用正则表达式删除所有空标签。见下文
@XmlJavaTypeAdapters({
@XmlJavaTypeAdapter(EmptyValueCleanerXmlAdapter.class)
})
package com.myapp.pojos;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
import com.xyz.mylib.EmptyValueCleanerXmlAdapter;
在ideone上运行代码