【问题标题】:How to configure JAXB so it trims whitespaces when unmarshalling tag value?如何配置 JAXB 以便在解组标记值时修剪空格?
【发布时间】:2008-12-11 13:22:16
【问题描述】:

如何配置 JAXB unmarshaller 以便从字符串中修剪前导和尾随空格?

例如,让我们考虑一个使用 JAXB 注释的 Java bean 和 XML 之间的简单绑定:

@XmlRootElement(name="bean")
class Bean {

  @XmlElement(required=true)
  String name;

  @XmlElement(required=true)
  int number;
}

我希望能够解组下面给出的 XML,因此 bean.name 不包括开头和结尾的空格 - 是“我的名字”,而不是“\n 我的名字\n "。

<bean>
  <name>
    My name
  </name>
  <number>1</number>
</bean>

【问题讨论】:

  • 不幸的是,如果您可以在没有换行符的情况下格式化输出,那么 XML 解析器会将其视为“重要”空白,这将比所有其他箍更容易......

标签: java xml jaxb


【解决方案1】:

使用自定义 Adapter 类。我在想NormalizedStringAdapter 会做这项工作,但它只是为了解组,无论如何它不会做你想做的事。

public class MyNormalizedStringAdapter extends XmlAdapter<String, String> {

    @Override
    public String marshal(String text) {
        return text.trim();
    }

    @Override
    public String unmarshal(String v) throws Exception {
        return v.trim();
    }
}

然后像这样用你的适配器装饰字段:

@XmlElement(required=true)
@XmlJavaTypeAdapter(MyNormalizedStringAdapter.class)
String name;

【讨论】:

  • 是否有其他方法可以在不制作自定义 XmlAdapter 的情况下实现这一目标?
  • 会不会是 NormalizedStringAdapter 完全坏掉了?它说它删除了前导和尾随空格(请参阅 javadoc),但实际上它没有!
  • @Kutzi 是的,文档或实现都是错误的。它所做的只是用空格替换制表符、lf 和 cr 字符。
  • 规范化不会消除空格,只会“规范化”它,因此@kapep 评论描述了“正确”的行为,即多个连续的“空白”字符被“规范化”为一个空格字符。
【解决方案2】:

要在解组过程中删除前导和尾随空格,您可以使用适配器 CollapsedStringAdapter(从 Java 1.6 开始)。

内置 XmlAdapter 来处理 xs:token 及其派生类型。这个 适配器删除前导和尾随空格,然后截断任何 制表符、CR、LF 和 SP 的序列由单个空白字符 ' ' 组成。

@XmlElement(required=true)
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
String name;

【讨论】:

  • 我试过这个适配器,但在解组 XML 文件时完全没有任何反应。有什么想法吗?
  • 你用的是 jaxb 还是别的?也许是 XStream?
  • 纯 jaxb,完全按照本教程中的描述:baeldung.com/jaxb
  • 神秘的......它应该可以工作。尝试在 getter 上设置注释。
猜你喜欢
  • 2011-11-17
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
相关资源
最近更新 更多