如何使用 jaxb 编码器避免空标签?
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()
但没有任何反应。
最佳答案
我找不到一种全局方法来完全删除空标记(除了在序列化之前不在 pojo 中设置属性)但是如果你想将所有空字符串转换为空值,即 <tagA></tagA>
至 <tagA/>
你可以使用 XmlAdapter
类如下;
第一步
扩展XmlAdapter
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;
}
}
第 2 步: 在 pojo 上应用:你可以通过不同的方式应用它,但其中一种全局方式是创建一个 package-info.java 文件,如下所示(它会进入你的 pojo 所在的包中)
@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;
编辑:替代解决方案
我最终在 xml 上使用正则表达式来去除所有空标签。见下文
// identifies empty tag i.e <tag1></tag> or <tag/>
// it also supports the possibilities of white spaces around or within the tag. however tags with whitespace as value will not match.
private static final String EMPTY_VALUED_TAG_REGEX = "\\s*<\\s*(\\w+)\\s*></\\s*\\1\\s*>|\\s*<\\s*\\w+\\s*/\\s*>";
在 ideone 上运行代码
关于java - 删除 jaxb 编码中的空 XML 标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39018679/