8

给定以下示例 xsd 片段:

< xs:attribute name="SEGMENT"  default="" use="optional" type="xs:string"/ >

当 xjc 生成包含SEGMENTbean 属性的类时,会自动生成以下 getter:

public String getSEGMENT() {
    if (segment == null) {
        return "";
    } else {
        return segment;
    }
}

我的问题是你如何让它对xs:element物体做同样的事情?换句话说,给定以下 xsd 片段:

< xs:element name="NAME" default="" type="xs:string"/ >

我想知道是否可以让 xjc 生成以下内容:

public String getNAME() {
    if (name == null) {
        return "";
    } else {
        return name;
    }
}

如何才能做到这一点?

4

1 回答 1

2

JAXB 不会为具有默认值的元素生成与具有默认值的属性相同的代码,因为XML 模式区分元素和属性的默认值

属性和元素的默认值都使用默认属性声明,尽管此属性在每种情况下的结果略有不同。当使用默认值声明属性时,该属性的值是在实例文档中作为属性值出现的任何值;如果该属性没有出现在实例文档中,则模式处理器为该属性提供一个等于默认属性的值。请注意,属性的默认值仅在属性本身是可选的情况下才有意义,因此同时指定默认值和可选值以外的任何值都是错误的。

模式处理器对默认元素的处理略有不同。当使用默认值声明元素时,该元素的值是在实例文档中作为元素内容出现的任何值;如果该元素出现时没有任何内容,则模式处理器为该元素提供一个等于默认属性的值。但是,如果该元素没有出现在实例文档中,则模式处理器根本不提供该元素。总之,元素默认值和属性默认值之间的区别可以表述为:当属性缺失时应用默认属性值,当元素为空时应用默认元素值。

您总是可以依靠缺少属性的默认值(从这里特殊的 getter),但是有一个缺少元素值的问题。

尽管如此,当您解组一个实例时,解组器知道如何处理默认值。有关详细信息,请参见此处:

XJC不会添加getter代码或使用默认值初始化字段,因此如果您需要“null安全检查”,您可以在XJC生成代码后自己手动添加或尝试使用一些插件来做自动地:

于 2012-12-16T18:11:12.440 回答