Если кто-то мне поможет, это будет здорово. Итак, у меня есть структура:
<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), но мне эта информация не нужна. Есть ли у кого-нибудь идеи?
Если вы используете @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;
}
}
похоже, что вы можете использовать generics - сохранить типы generic: Удалить xsi: type, xmlns: xs и xmlns: xsi из JAXB Generics
Но мой ответ - не удалять объявление xmlns: xsi. Я знаю, что было бы лучше, если бы он был в верхнем элементе. Но - таким образом, это по-прежнему действительный XML с действительной и полной идентификацией типа. XML предназначен для чтения машинами. Без атрибута xsi: type сопоставление между объектами и XML больше не будет детерминированным (и вы не могли бы также достоверно проверить XML).
Удачи.. Габриэль