Support XML element name based on runtime type

Aperta
#679 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
5/5
Tempo stimato
Più di una settimana
Idoneità per principianti
25/100
Tipo di issue
Funzionalità
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
java

Direzione di ricerca

Inizia dal modello Java e dall’esempio di substitution-group di XSD, quindi esamina come le annotazioni Jackson XML determinano attualmente i nomi degli elementi durante la serializzazione e la deserializzazione. Confronta le istanze XML di cow e goat con il comportamento desiderato del tipo a runtime; il lavoro è completato quando entrambe le forme vengono associate al sottotipo Animal appropriato e serializzate nuovamente usando il nome dell’elemento corrispondente.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

XSD schema's support a way to name an element based on its runtime type through substitution groups. I'm trying to deserialise such a substitution group. Is this supported in some way?

Example. Suppose there is two types of Animals: Cows and Goats. Based on their type, I want their element to be named either cow or goat. This would be modelled as follows:

XSD:

<!-- XML root element -->
<xs:element name="document">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="animal"/> <!-- Note that the name of this element is determined by the actual type of animal -->
    </xs:sequence>
  </xs:complexType>
</xs:element>

<!-- Element names: `Cow`s should be serialised as an element named `cow`, `Goat`s should be serialised as an element named `goat`. -->
<xs:element name="animal" type="Animal" abstract="true" />
<xs:element name="cow" type="Cow" substitutionGroup="animal" />
<xs:element name="goat" type="Goat" substitutionGroup="animal" />

<!-- Types: `Cow` and `Goat` extend from `Animal` -->
<xs:complexType name="Animal">
  <xs:attribute name="name" type="xs:string" />
</xs:complexType>
<xs:complexType name="Cow">
  <xs:complexContent>
    <xs:extension base="Animal" />
  </xs:complexContent>
</xs:complexType>
<xs:complexType name="Goat">
  <xs:complexContent>
    <xs:extension base="Animal" />
  </xs:complexContent>
</xs:complexType>

XML example instances:

<document>
    <cow name="Cow1" />
</document>
<document>
    <goat name="Goat1" />
</document>

Java model:

@XmlRootElement(name="document")
public class Document {
  private Animal animal;

  public Animal getAnimal() {
    return animal;
  }
  public void setAnimal(Animal animal) {
    this.animal = animal;
  }
}

public class Animal {
  @JacksonXmlProperty(isAttribute = true)
  private String name;

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

public class Cow extends Animal {}

public class Goat extends Animal {}

Is there a way of annotating the classes to get the desired behaviour?

Lingua principale
Java
Stelle
636
Fork
250
Merge medio
7h 10m
PR unite (30g)
8

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di FasterXML/jackson-dataformat-xml

Tutte le issue di FasterXML/jackson-dataformat-xml

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.