Удалить xsi: type после сортировки абстрактного класса с иерархией

1

Если кто-то мне поможет, это будет здорово. Итак, у меня есть структура:

<letters> <list> <name>Simon</name> <type>2</type> <passengerName>Johny</passengerName> <passengerSurname>Revelator</passengerSurname> </list> <list> <name>someName</name> <type>4</type> <fileURL>someUrl</fileURL> <specialNotes>specialNotes</specialNotes> </list> </letters>

Для этой структуры я написал Java-классы, и они маршаллируют и отменят ее: пакет класса A com.edhex.testing;

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), но мне эта информация не нужна. Есть ли у кого-нибудь идеи?

Показать ещё 1 комментарий
Теги:
jaxb

2 ответа

4
Лучший ответ

Если вы используете @XmlElementRef для свойства list элемент для элемента будет основан на @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;
    }
}
  • 1
    замечательно!! не заметил эту аннотацию!
1

похоже, что вы можете использовать generics - сохранить типы generic: Удалить xsi: type, xmlns: xs и xmlns: xsi из JAXB Generics

Но мой ответ - не удалять объявление xmlns: xsi. Я знаю, что было бы лучше, если бы он был в верхнем элементе. Но - таким образом, это по-прежнему действительный XML с действительной и полной идентификацией типа. XML предназначен для чтения машинами. Без атрибута xsi: type сопоставление между объектами и XML больше не будет детерминированным (и вы не могли бы также достоверно проверить XML).

Удачи.. Габриэль

  • 0
    да я с тобой согласен ... но все же этот атрибут xsi: type меня раздражает (

Ещё вопросы

Сообщество Overcoder
Наверх
Меню