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

在使用层次结构编组抽象类后删除xsi:type

欧阳何平
2023-03-14

如果有人帮我,那就太好了。所以我有一个结构:

<代码>

对于这种结构,我编写了Java类,它们对其进行整理和解压:Class A package com。edhex。测试;

import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlSeeAlso({B.class, C.class})
@XmlType
abstract public class A {
    int type;
    String name;

    @XmlElement
    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    @XmlElement
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

班级字母:

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Letters {
    List<A> list;

    @XmlElement
    public List<A> getList() {
        return list;
    }

    public void setList(List<A> list) {
        this.list = list;
    }
}

B类:

@XmlRootElement
@XmlType
@XmlAccessorType(XmlAccessType.PROPERTY)
public class B extends A {
    String fileURL;
    String specialNotes;
    @XmlElement
    public String getFileURL() {
        return fileURL;
    }

    public void setFileURL(String fileURL) {
        this.fileURL = fileURL;
    }
    @XmlElement
    public String getSpecialNotes() {
        return specialNotes;
    }

    public void setSpecialNotes(String specialNotes) {
        this.specialNotes = specialNotes;
    }
}

C类:

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)

public class C extends A {
    String passengerName;
    String passengerSurname;
    @XmlElement
    public String getPassengerName() {
        return passengerName;
    }

    public void setPassengerName(String passengerName) {
        this.passengerName = passengerName;
    }
    @XmlElement
    public String getPassengerSurname() {
        return passengerSurname;
    }

    public void setPassengerSurname(String passengerSurname) {
        this.passengerSurname = passengerSurname;
    }
}

一切看起来都很好,但编组后,我这样做:

public static void main(String[] args) {
        C c = new C();
        c.setName("Simon");
        c.setType(2);
        c.setPassengerName("Johny");
        c.setPassengerSurname("Revelator");
        B b = new B();
        b.setType(4);
        b.setFileURL("someUrl");
        b.setSpecialNotes("specialNotes");
        b.setName("someName");

        List<A> list = new ArrayList<A>(2);
        list.add(c);
        list.add(b);
        Letters letter = new Letters();
        letter.setList(list);
        try {
            File file = new File("C:\file.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(Letters.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(letter, file);
            jaxbMarshaller.marshal(letter, System.out);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

我得到如下输出:

<letters>
    <list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="c">
        <name>Lasha</name>
        <type>2</type>
        <passengerName>Johny</passengerName>
        <passengerSurname>Revelator</passengerSurname>
    </list>
    <list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b">
        <name>someName</name>
        <type>4</type>
        <fileURL>someUrl</fileURL>
        <specialNotes>specialNotes</specialNotes>
    </list>
</letters>

问题:如何删除这些:xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“xsi:type=“b”在每个列表标记中?我知道JAXB会通知我它使用的是什么类型,因为最初的映射使用的是另一种类型(A.class),但我不需要这些信息。有人有什么想法吗?

共有2个答案

皇甫学海
2023-03-14

看起来您可以使用泛型来保持泛型:从JAXB泛型中删除xsi:type、xmlns:xs和xmlns:xsi

但我的答案是——不要删除xmlns:xsi声明。我知道把它放在最上面看起来会更好。但是,这样它仍然是有效的XML,具有有效和完整的类型标识。XML是要由机器读取的。如果没有xsi:type属性,对象和XML之间的映射将不再是确定性的(而且您也无法可靠地验证XML)。

玩得高兴加布里埃尔

王航
2023-03-14

如果在列表属性上使用了xmlementref,则该项的元素将基于引用类的XmlRootElement,而不会获得xsi:type属性。

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Letters {
    List<A> list;

    @XmlElementRef
    public List<A> getList() {
        return list;
    }

    public void setList(List<A> list) {
        this.list = list;
    }
}
 类似资料:
  • 零售商店的正确模式是什么?公司从商店销售产品。 这似乎违反了我对OOP所知的全部知识。通过层次结构向下传递数据的方法--在对象之间复制参数?我错过了什么?

  • 问题内容: 我有一个包含分层数据的表。 列“ ParentId”保存其父级的ID(“ ID”-关键列)。 删除一行时,我要删除所有子级(所有级别的嵌套)。 怎么做? 谢谢 问题答案: 当行数不太大时,erikkallen的递归方法起作用。 这是使用临时表收集所有子项的替代方法: 它从带有@delete_id的行开始,然后从那里开始。where语句用于防止递归;如果您确定没有任何内容,则可以将其忽略

  • 问题内容: 我在 .NET for WinRT(C#)中 ,我想将JSON字符串反序列化为,然后将字典值稍后转换为实际类型。JSON字符串可以包含对象层次结构,我也希望在其中包含子对象。 这是应该能够处理的示例JSON: 我尝试使用 DataContractJsonSerializer 这样做: 实际上,这对于第一个级别是可行的,但是 “父母” 只是一个不能强制转换为的对象: 然后,我尝试使用 J

  • 问题内容: 我试图从我的MySQL数据库中按层次结构获取所有类别和子类别: 我的结果应该是这样(只是示例): 猫A 子猫1 Sub_Sub_Cat 1 Sub_Sub_Cat 2 子猫2 猫B C猫 … MySQL代码: 简而言之,如何在使用 PHP代码 的层次结构中获得它? 问题答案: 使用邻接表模型时,您可以一次性生成结构。 取自一遍父子数组结构(2007年9月; Nate Weiner撰写)

  • 我有一个类的层次结构:是一个基本抽象类

  • 我想将Nightwatch的页面对象系统用于我们应用程序中使用的UI组件。因为nightwatch有自己的读取/初始化它们的方式,所以我看不到正确扩展/重用它们的方法。 例如,我想要一个“日期字段”的DateInputPageObject。它将识别标签、输入、日期选择器等。 我会在任何带有日期输入字段的页面上使用它。 我还想扩展页面对象。例如,。将为所有模态元素定义选择器-覆盖、容器、关闭按钮等。