2016-09-28 1 views
0

J'essaie de désérialiser ce bout de XML en Java:XML simple désérialisation différents types d'éléments avec le même nom

<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> 

Le problème que je suis en cours d'exécution en est que l'élément soit info peut avoir une ligne liste de img ou il peut simplement contenir du texte. Je pensais traiter info comme @Element dans ma classe AnimeHolder, mais je ne peux pas avoir d'annotations en double. Je voudrais également accéder à l'attribut lang d'info pour vérifier si c'est EN ou JP.

J'utilise ces classes pour contenir les données désérialisé:

@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; 
    } 
} 

et pour les articles d'information:

@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

Vous devrez peut-être définir '' comme ayant un contenu «mixte» et gérer le texte par rapport aux éléments '' dans le code, par ex. pour interdire d'avoir à la fois le texte et "" en même temps. Voir "[Comment traiter avec JAXB ComplexType avec des données MixedContent?] (Http://stackoverflow.com/q/12568247/5221149)". – Andreas

+0

Merci! Cela m'a indiqué dans la bonne direction. Poster ma solution –

Répondre

0

Avec Andreas j'ai découvert que je devais regarder dans la manipulation du contenu mixte. Faire des recherches me conduire à cette solution sur la création d'une coutume Converter. Après avoir écrit le mien et découvert qu'il n'était pas appelé, this a aidé à le régler. Voici ma classe retravaillé InfoHolder et convertisseur:

@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 { 

     } 
    } 
} 

J'ai aussi besoin d'instancier un SimpleXmlConverterFactory avec un Serializer en utilisant AnnotationStrategy comme ceci:

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

En utilisant une mesure Converter a exposé les noeuds XML, qui m'a permis de déterminer si le nœud info avait img enfants, et sinon, obtenir la valeur du nœud lui-même.