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

=================jaxb: Bindung von Daten aus XML in Java geschieht nicht mit dieser Struktur

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

} 

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

Its me null zurückkehrt, wenn ich

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

Könnte mir bitte jemand sagen, was ist das Problem?

Das ist meine Klasse 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(); 
} 

ich es nenne diese Art und Weise

Message message = BADFMParser.parse(XMLFile); 

Antwort

1

Wo bekommen Sie 'm' aus? Veröffentlichen Sie Ihren Code für das Unmarshalling.

Als eine Randnotiz, wenn Sie Klassen manuell erstellt haben, besteht die Möglichkeit, dass Sie etwas falsch gemacht haben. Der einfachste Weg zur Plausibilitätsprüfung besteht darin, ein Schema für Ihr XML zu erstellen (wenn Sie es nicht haben, sollten Sie es aus vielen Gründen tun) und Java-Klassen mit 'xjc' (kommt mit JDK) generieren. Dann könntest du diese Klassen entweder direkt zu Marshal/Unmarshal benutzen oder sie einfach untersuchen, um zu sehen, wie sie sich von deinen unterscheiden.

+0

Ich habe es in meiner Frage (die Parser-Klasse) hinzugefügt – Pawan

0

Dieses Bit des Codes ...

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

... ist etwas rätselhaft. Du bekommst ein Objekt vom Unmarshaller, wirfst es auf BADFM und bekommst dann ein JAXBElement? Was ist diese BADFM-Klasse?

ich Ihre Nachricht aufgenommen haben, MobBlock, Ord und Bagger Klassen, legte sie in einem Paket und erstellt dann diese Hauptklasse drin:

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()); 

    } 

} 

Das Ergebnis funktioniert gut. Es gibt C aus, wenn es ausgeführt wird.