当前位置: 首页 > 知识库问答 >
问题:

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

罗昕
2023-03-14
@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”,但我向它传递了一个字符串(尽管我已经将它转换为Object)。我也看过这个帖子,看起来和我的问题类似:

然而,这并不能帮助我克服我的问题。是否有方法删除这些对xmlns:xsi和xsi:type的引用?

THX

共有1个答案

曹景铄
2023-03-14

如果您的数据指定了模型以外的其他类型,JAXB将导出xsi:type。在您的示例中,设置了一个字符串,但字段是object。因此数据的类型与模型不同。行为是正确的。

你该怎么解决这个问题。您已经将属性的类型与数据的类型对齐。有很多方法可以实现:

  • 使其成为字符串,为什么它首先是对象
  • 更新:您可以为此使用jaxb:javatype绑定。
  • 改为SE@XmlElementRef/@XmlMixed组合。

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

 类似资料:
  • 问题内容: 使用JAXB时,我想在使用泛型时从XML元素中删除多余的名称空间/类型。我该怎么办或我做错了什么?我想使用泛型,这样我只需要编写一次代码块。 示例代码: 输出: 问题答案: 通用测试 您的JAXB(JSR-222)实现将为每个类创建映射(即,不是type(即)。因此,它将字段视为type 。这将导致属性,因为JAXB实现正在添加足够的信息才能解组相同的类型。 演示版 下面是您可以使用的

  • 问题内容: 我使用JAXB创建文件夹和文件层次结构 我的模特: 我想制作目录和文件树: 但是我在生成的xml中有一个奇怪的“ xsi:type”和“ xmlns:xsi”: 所以我的问题是:这是什么意思,如何删除? 问题答案: 在您的类中,您没有指定集合的​​类型,这就是JAXB添加属性的原因。 你有: 如果您要包含的实例,则可以执行以下操作: 如果由于某种原因您不想在集合中指定类型,则可以在批注

  • 但是我在生成的XML中有奇怪的“xsi:type”和“xmlns:xsi”: 所以我的问题是:这是什么意思,如何删除它?

  • 问题内容: 我需要有关从UTF-8文件删除BOM并创建其余xml文件的副本的方法的建议。 问题答案: 有因为在UTF-8文件中的BOM的工具断裂是一个 非常 以我的经验平常的事。我不知道为什么会有这么多的否决票(但是这给了我机会去尝试赢得足够的选票来赢得特殊的SO徽章;) 更严重的是:UTF-8 BOM通常没有太大意义, 但 在规格上完全有效(尽管不建议使用)。现在的问题是,很多人不知道BOM在U

  • 我正在尝试封送和取消封送映射到值对/从值对。我可以成功封送该对象,但是,我不能从XML中取消封送它。反封送结果是映射中存在的关键字,但其值为空。 下面是我要封送和取消封送的模型: 而且我还发现了一个关于这个问题的类似问题“JAXB:如何将映射编入 value ”,然而,它并没有解决解编组问题?

  • 2)如果我按照下面的方式编辑package-info,那么它是很好的,但是问题是我创建的是一个JAXB整数元素如下所示,前缀删除没有应用于这些元素