2016-09-28 6 views
0

Ich versuche, diese Schnipsel von XML in Java deserialisieren:Einfache XML-Deserialisierung verschiedene Elementtypen mit dem gleichen Namen

<anime id="16986"> 
    <info type="Picture" src="http://~.jpg" width="141" height="200"> 
     <img src="http://~" width="141" height="200"/> 
     <img src="http://~" width="318" height="450"/> 
    </info> 
    <info type="Main title" lang="EN">Long Riders!</info> 
    <info type="Alternative title" lang="JA">ろんぐらいだぁす!</info> 
</anime> 

Das Problem, das ich in laufende bin ist, dass das info Element entweder ein Inline haben Liste von img oder es kann nur Text enthalten. Ich dachte daran, info als @Element in meiner AnimeHolder-Klasse zu behandeln, aber ich kann keine doppelten Anmerkungen haben. Ich möchte auch auf das lang Attribut der Info zugreifen, um zu überprüfen, ob es EN oder JP ist.

ich diese Klassen bin mit den entserialisierten Daten zu halten:

@Root(name="anime", strict=false) 
public class AnimeHolder { 

    @Attribute(name="id") 
    private String ANNID; 

    @ElementList(inline=true) 
    private List<InfoHolder> infoList; 

    public String getANNID() { 
     return ANNID; 
    } 

    public List<InfoHolder> getInfoList() { 
     return infoList; 
    } 
} 

und für die Info-Objekte:

@Root(name="info", strict = false) 
public class InfoHolder { 

    @ElementList(inline=true, required = false) 
    private List<ImgHolder> imgList; 

    @Attribute(name = "lang", required = false) 
    private String language; 

    public List<ImgHolder> getImgList() { 
     return imgList; 
    } 
} 
+1

Möglicherweise müssen Sie definieren "" als "gemischt" Inhalt und behandeln die Text vs '' Elemente im Code, z. verbieten, gleichzeitig Text und '' zu haben. Siehe "[Umgang mit JAXB ComplexType mit MixedContent-Daten?] (Http://stackoverflow.com/q/12568247/5221149)". – Andreas

+0

Danke! Das hat mich in die richtige Richtung gelenkt. Meine Lösung veröffentlichen. –

Antwort

0

Mit Andreas' fand ich heraus, dass ich in der Handhabung gemischten Inhalts suchen benötigt. Einige Suche führen mich zu diesem solution über die Erstellung eines benutzerdefinierten Converter. Nachdem ich mein eigenes geschrieben hatte und herausfand, dass es nicht aufgerufen wurde, half this, es zu klären. Hier ist meine überarbeitete InfoHolder Klasse und Konverter:

@Root(name="info", strict = false) 
@Convert(InfoHolder.InfoConverter.class) 
public class InfoHolder { 

    private String englishTitle; 
    private String imageURL; 

    static class InfoConverter implements Converter<InfoHolder> { 
     @Override 
     public InfoHolder read(InputNode node) throws Exception { 
      String value = node.getValue(); 
      InfoHolder infoHolder = new InfoHolder(); 

      if (value == null){ 
       InputNode nextNode = node.getNext(); 
       while (nextNode != null){ 
        String tag = nextNode.getName(); 

        if (tag.equals("img") && nextNode.getAttribute("src") != null){ 
         infoHolder.imageURL = nextNode.getAttribute("src").getValue(); 
        } 
        nextNode= node.getNext(); 
       } 
      } else { 
       while (node != null){ 
        if (node.getAttribute("lang") != null){ 
         if (node.getAttribute("lang").getValue().equals("EN")){ 
          infoHolder.englishTitle = value; 
          break; 
         } 
        } 
        node = node.getNext(); 
       } 
      } 

      return infoHolder; 
     } 

     @Override 
     public void write(OutputNode node, InfoHolder value) throws Exception { 

     } 
    } 
} 

ich auch ein SimpleXmlConverterFactory mit einem SerializerAnnotationStrategy mit instanziiert benötigt etwa so:

SimpleXmlConverterFactory factory = SimpleXmlConverterFactory.create(new Persister(new AnnotationStrategy())); 

Verwenden einer benutzerdefinierten Converter die XML-Knoten ausgesetzt, die erlaubt mir herauszufinden, ob der info Knoten img Kinder, und wenn nicht, den Knotenwert selbst erhalten.

Verwandte Themen