在jaxb编组中删除空XML标记

时间:2016-08-18 12:48:16

标签: java xml jaxb

如何使用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(),但没有任何事情发生。

1 个答案:

答案 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上运行代码