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

=================JAXB:从XML到Java的数据绑定是不是跟这个结构发生

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

} 

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

它返回我空,当我试图访问

系统.out.println(m.getMob()getOrd()getBagger()getDSE()。);

请问有谁能告诉我是什么问题?

这是我的解析器

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

我打电话这样说

Message message = BADFMParser.parse(XMLFile); 

回答

1

你在哪里得到的 'M'?发布解码代码。

作为一个方面说明,如果您手动创建类,可能会发生错误。执行完整性检查的最简单方法是为XML创建模式(如果您没有它,则应该出于许多原因)并使用'xjc'(随JDK提供)生成Java类。然后你可以直接使用这些类到Marshal/Unmarshal,或者只是检查它们,看看它们与你的不同。

+0

我已经添加了它在我的问题(解析器类) – Pawan 2012-04-04 13:50:22

0

代码的此位...

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

......是有点令人费解。你从Unmarshaller中获得一个Object,将它转换为BADFM,然后从中获得一个JAXBElement?这个BADFM课程是什么?

我已经采取了你的消息,MobBlock,Ord和巴格尔班,把他们安置在一个包,然后创造了这个主类:

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

    } 

} 

结果工作正常。运行时输出C