gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:19:56 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com