java - 删除 jaxb 编码中的空 XML 标记

标签 java xml jaxb

如何使用 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/

相关文章:

java - Method getResources not annotated with request type (e.g., GET, POST) 是什么意思?

PHP 启动 : Unable to load dynamic library (xsl. so/libexslt.so.0)

php - 通过php将xml数据插入mysql数据库

python - 如何让 Python 的 ElementTree 强制执行 XML 模式?

java - Jaxb 解码任何类型的 xml 文档

java - 单元测试旨在检查特定故障,但即使抛出了预期的异常,它仍然失败?

java - == 抽象数据类型,相同条件下的不同结果

java - 卡在平均字长上

java - JAXB - "collision in the object factory class"的解决方案和策略

java - XML 日期绑定(bind)到 Java 对象日期