如何从JAXB编组的XML文件中删除xmlns:xsi和xsi:type

时间:2014-11-25 14:59:33

标签: java xml eclipse jaxb moxy

我有一组JAXB生成的类,有些类具有接受的setter方法 "对象"作为参数。例如:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="Car", propOrder = {
    "defaultCar"
} 

public class Car {
  @XmlElement(name = "DefaultCar") 
  protected Object defaultcar;  

  public void setDefaultCar(Object value) {
    this.defaultCar = value;
}

在我的代码中创建了这些类的实例后,我调用setter方法传递所需的值。虽然方法的参数是Object,但这些值最有可能是字符串(我无法控制它的定义方式)。但是,为了保持一致,我将字符串转换为Object,以便它与方法的参数类型匹配。代码看起来像这样:

    Object value = "Old Banger";
    Method method = aCar.getClass().getMethod("setDefaultCar", Object.class);
    method.invoke(aCar, value);

当我编组Java对象时,我在结果XML中得到以下内容,就在字符串的值前面:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string" 

我已经在某处了解了方法参数类型与传递给它的内容之间的数据类型不匹配。在我的例子中,方法参数是"对象"但是我把一个字符串传递给它(尽管我已经将它转换为Object)。我也看过这篇帖子,看起来和我的问题类似:

"xsi:type" and "xmlns:xsi" in generated xml by JAXB

然而,它并没有帮助我克服我的问题。有没有办法删除这些对xmlns的引用:xsi和xsi:type?

THX

3 个答案:

答案 0 :(得分:6)

如果您的数据指定的是除模型之外的其他类型,则JAXB会导出xsi:type。在您的情况下,您设置了一个字符串,但字段为Object。因此,您的数据类型与您的模型不同。行为是正确的。

如何解决这个问题。您已将属性的类型与数据类型对齐。有很多方法可以实现这一目标:

  • 将其设为String,为什么它首先是Object
  • 更新:您可以使用jaxb:javaType绑定。
  • Ùse@XmlElementRef / @XmlMixed组合而不是。
  

但是,为了保持一致,我将字符串转换为Object   它匹配方法的参数类型。

当你将它转换为对象时,你认为字符串会发生什么? :)

答案 1 :(得分:3)

您始终可以使用type注释上的@XmlElement参数覆盖属性类型。

  @XmlElement(name = "DefaultCar", type=String.class) 
  protected Object defaultcar;  

答案 2 :(得分:0)

我有类似的问题。我将带有这些属性的XML发送给一些无法处理它的WS。我记得我使用Apache CXF发送这个XML,所以我最终得到了CXF拦截器来处理这些属性的删除。

可悲的是,我没有找到办法如何禁用"直接在JAXB中生成这些属性。您可以做的(并且可能是解决它的唯一方法)是您使用生成的XML并使用另一个(DOM / SAX)API再次处理它并手动删除属性。这绝对不是一个好的解决方案,但我不确定你是否找到了更好的: - /

如果有人给你一个更好的答案,我会很高兴...