2012-04-04 1 views
0
<BADFM> 
<Order > 
<Ord OrdQty="1" faft="O"> 
<Bag pakka="1" DSE="C"/> 
</Ord> 
</Order> 
</BADFM> 

=================JAXB: La liaison de données XML de Java ne se produit pas avec cette structure

@XmlRootElement(name="BADFM") 
public class Message 
{ 
@XmlElement(name="Order") 
private MobBlock mob; 
public MobBlock getMob() { 
return mob; 
} 
public void setmob(MobBlock mob) { 
this.mob = mob; 
} 
} 

===== =============

public class MobBlock { 
    private Ord ord; 
    @XmlElement(name="Ord") 
        public Ord getOrd() { 
    return ord; 
    } 
    public void setOrd(Ord ord) { 
     this.ord = ord; 
    } 
} 

===================

public class Ord { 
private Bagger Bagger; 
@XmlElement(name="Bag") 
    public Bagger getBagger() { 
    return Bagger; 
    } 
    public void setBagger(Bagger Bagger) { 
       this.Bagger = Bagger; 
    } 
    } 

==== ==================

public class Bagger { 
    private String dsc; 
    @XmlAttribute(name = "DSE") 
    public String getDSE() { 
     return dsc; 
    } 
       public void setDSE(String dsc) { 
    this.dsc = dsc; 
        } 

} 

========================

Son retour me nulle, quand j'ai essayé d'accéder

système .out.println (m.getMob(). getOrd(). getBagger(). getDSE());

Quelqu'un pourrait-il me dire quel est le problème?

Ceci est ma classe Parser

public class BadFmParser 
{ 
public static AbstractMessageT parse(String Str) throws Exception { 
    private static JAXBContext jc = null; 

      jc = JAXBContext.newInstance("mypackage"); 

     Unmarshaller um = jc.createUnmarshaller(); 
     BADFM badfmMessage = (BADFM) um.unmarshal(new StringReader(Str)); 
     JAXBElement<? extends Message> element = badfmMessage.getMessage(); 
     return element.getValue(); 
} 

je l'appelle ainsi

Message message = BADFMParser.parse(XMLFile); 

Répondre

1

Où obtenez vous m 'de? Postez votre code pour unmarshalling.

En remarque, si vous avez créé des classes manuellement, il y a de fortes chances que vous ayez fait quelque chose de mal. Le moyen le plus simple de vérifier la cohérence est de créer un schéma pour votre XML (si vous ne l'avez pas, alors vous devriez, pour plusieurs raisons) et générer des classes Java avec 'xjc' (livré avec JDK). Ensuite, vous pouvez soit utiliser ces classes directement à Marshal/Unmarshal ou simplement les inspecter pour voir comment elles sont différentes des vôtres.

+0

Je l'ai ajouté à ma question (la classe parser) – Pawan

0

Ce bit de votre code ...

BADFM badfmMessage = (BADFM) um.unmarshal(new StringReader(Str)); 
JAXBElement<? extends Message> element = badfmMessage.getMessage(); 

... est un peu déroutante. Vous obtenez un objet du Unmarshaller, le transtypez en BADFM et vous en récupérez un JAXBElement? Quelle est cette classe BADFM?

J'ai pris votre message, les classes MobBlock, Ord et Bagger, les a placés dans un paquet, puis créé cette classe principale en elle:

package jaxb1; 

import java.io.Reader; 
import java.io.StringReader; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Unmarshaller; 

public class Main { 

    public static void main(String[] args) throws Exception { 

     final JAXBContext context = 
      JAXBContext.newInstance(
      Bagger.class, 
      Ord.class, 
      MobBlock.class, 
      Message.class 
      ); 

     final Unmarshaller unmarshaller = context.createUnmarshaller(); 

     final Reader reader = 
      new StringReader("<?xml version=\"1.0\"?>\r\n" 
      + "<BADFM>\r\n" 
      + "<Order >\r\n" 
      + "<Ord OrdQty=\"1\" faft=\"O\">\r\n" 
      + "<Bag pakka=\"1\" DSE=\"C\"/>\r\n" 
      + "</Ord>\r\n" 
      + "</Order>\r\n" 
      + "</BADFM>"); 

     final Object o = unmarshaller.unmarshal(reader); 

     final Message m = (Message)o; 

     System.out.println(m.getMob().getOrd().getBagger().getDSE()); 

    } 

} 

Le résultat fonctionne très bien. Il sort C lorsqu'il est exécuté.

Questions connexes