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

use*_*079 6 java xml eclipse jaxb moxy

我有一组JAXB生成的类,有些类有setter方法,它接受"Object"作为参数.例如:

@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;
}
Run Code Online (Sandbox Code Playgroud)

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

    Object value = "Old Banger";
    Method method = aCar.getClass().getMethod("setDefaultCar", Object.class);
    method.invoke(aCar, value);
Run Code Online (Sandbox Code Playgroud)

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

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

我在某处读到了方法参数类型与传递给它的内容之间不匹配的数据类型.在我的例子中,方法参数是"对象",但我传入一个字符串给它(虽然我把它转换为对象).我也看过这篇文章,它看起来与我的问题类似:

JAXB生成的xml中的"xsi:type"和"xmlns:xsi"

但是,它无助于我解决我的问题.有没有办法删除这些对xmlns的引用:xsi和xsi:type?

谢谢

lex*_*ore 6

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

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

  • 制作它String,为什么它Object首先是一个?
  • 更新:您可以使用jaxb:javaType绑定.
  • Ùse @XmlElementRef/ @XmlMixedcombo而不是.

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

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


zde*_*ine 0

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

遗憾的是,我没有找到一种方法来直接在 JAXB 中“禁用”这些属性的生成。您可以做的(并且可能是解决该问题的唯一方法)是获取生成的 XML 并使用另一个 (DOM/SAX) API 再次处理它并手动删除属性。这绝对不是一个好的解决方案,但我不确定您是否找到更好的解决方案:-/

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