2012-10-28 5 views
5

FIXML biçiminde küçük bir XML belgesine sahibim. Onları jaxb kullanarak uncalıyorum.Jaxb unmarshalls fixml nesnesi, ancak tüm alanlar sıfırdır

hatasız eksiksiz süreç sorunu ancak oluşturulan nesneler tamamen boş. Her alan boş. Listeler (Qty gibi) olan alanların içinde doğru sayıda nesne bulunur. Ancak bu nesnelerin alanları da boştur.

ben here gelen FIXML şema indirdiğiniz ve ben XJC ve maven eklenti ile sınıfları oluşturduk

Kur. Hepsi org.fixprotocol.fixml_5_0_sp2 paketindedir. Bir dosyada örnek xml var

FIXML.XML

<?xml version="1.0" encoding="ISO-8859-1"?> 
<FIXML> 
<Batch> 
    <PosRpt> 
    <Pty ID="GS" R="22"/> 
    <Pty ID="01" R="5"/> 
    <Pty ID="6U8" R="28"> 
     <Sub ID="2" Typ="21"/> 
    </Pty> 
    <Pty ID="GS" R="22"/> 
    <Pty ID="6U2" R="2"/> 
    <Instrmt ID="GHPKRW" SecTyp="FWD" MMY="20121018" MatDt="2012-10-18" Mult="1" Exch="GS" PxQteCcy="KJS" FnlSettlCcy="GBP" Fctr="0.192233298" SettlMeth="G" ValMeth="FWDC2" UOM="Ccy" UOMCCy="USD"> 
     <Evnt EventTyp="121" Dt="2013-10-17"/> 
     <Evnt EventTyp="13" Dt="2013-10-17"/> 
    </Instrmt> 
    <Qty Long="0.000" Short="22000000.000" Typ="PNTN"/> 
    <Qty Long="0.000" Short="22000000.000" Typ="FIN"/> 
    <Qty Typ="DLV" Long="0.00" Short="0.00" Net="0.0"/> 
    <Amt Typ="FMTM" Amt="32.332" Ccy="USD"/> 
    <Amt Typ="CASH" Amt="1" Rsn="3" Ccy="USD"/> 
    <Amt Typ="IMTM" Amt="329.19" Ccy="USD"/> 
    <Amt Typ="DLV" Amt="0.00" Ccy="USD"/> 
    <Amt Typ="BANK" Amt="432.23" Ccy="USD"/> 
</PosRpt> 

Sonra sadece bir istisna atar özel olay işleyicisi ile unmarshaller arıyorum ayrıştırma hatası. Ayrıştırma tamamlandı, bu yüzden oluşturulmakta hata olmadığını biliyorum. fixml nesnesi oluşturulur here

// sort out the file 
String xmlFile = "C:\\FIXML.XML.xml"; 
System.out.println("Loading XML File..." + xmlFile); 
InputStream input = new FileInputStream(xmlFile); 
InputSource is = new InputSource(input); 

// create jaxb context 
JAXBContext jc = JAXBContext.newInstance("org.fixprotocol.fixml_5_0_sp2"); 
Unmarshaller unmarshaller = jc.createUnmarshaller(); 

// add event handler so jacB will fail on an error 
CustomEventHandler validationEventHandler = new CustomEventHandler(); 
unmarshaller.setEventHandler(validationEventHandler); 

// set the namespace 
NamespaceFilter inFilter = new NamespaceFilter("http://www.fixprotocol.org/FIXML-5-0-SP2", true); 

inFilter.setParent(SAXParserFactory.newInstance().newSAXParser().getXMLReader()); 
SAXSource source = new SAXSource(inFilter, is); 

// GO! 
JAXBElement<FIXML> fixml = unmarshaller.unmarshal(source, FIXML.class); 

önerdiği gibi Ben de ad hallediyorum. Yukarıdaki örnekte, Amt dizisinde, dosyadaki am sayısıyla eşleşen beş öğe bulunur. Fakat ccy gibi tüm alanlar boş. Xjc tarafından oluşturulan sınıflara kesme noktaları koydum ve hiçbir zaman dizilerinden hiç biri gelmedi.

Bu yüzden jaxb unmarshalling ve tüm doğru nesneleri yaratıyor, ama asla setters çağıran görünüyor?

Bu konuda tamamen şaşırdım. Xjc tarafından üretilen package.info dosyasının paketlerde olduğundan emin olmak için bir kaç mesaj görüyorum ve orada olduğundan emin oldum. Oluşturulan kod hakkında IDE'de uyarı yok.

Herhangi bir yardım çok takdir edilmektedir.

Güncelleştirme Düzenleme işlemine başlamadan önce, şema dosyasını şempanzede ayarlamaya çalıştım.

Schema schema = sf.newSchema(f); 
unmarshaller.setSchema(schema); 

ben sırayla her dosyayı çalışırken bir döngü içinde benim yaptığımı bu yüzden kullanılacak şema emin değildi. Yükselenlerin hiçbiri işe yaramaz. Hataya neden oluyor Geçersiz içerik, 'PosRpt' öğesiyle başlayarak bulundu.

Bu şaşırtıcı bir durumdur. Şimdi problemin ad alanı ile olduğunu düşünüyorum.

Güncelleştirme 2 Hala ilerleme yok. JAXB 2.0 & 2.2'yi denedim. Şimdi xjc aramak için farklı maven eklentisine bakıyor.Ama bence öyle değil.

Güncelleştirme 3 Şimdi, düzeltme kodunu okurken, onu ayrı bir dosyaya yeniden yerleştiriyorum.

// GO! 
JAXBElement<FIXML> fixml = unmarshaller.unmarshal(source, FIXML.class); 

//Write  
Marshaller marshaller = jc.createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
marshaller.marshal(fixml, output); 

sonuçlar şöyle:

inputfile.xml

<FIXML> 
    <Batch> 
    <PosRpt RptID="5952323" ReqID="434242" SetSesID="EOD" MtchStat="2" PriSetPx="11.284328" SetPx="11.4432" SetPxTyp="1" SettlCcy="EUR" ReqTyp="1" MsgEvtSrc="REG" BizDt="2012-11-17" SettlDt="2018-11-20"> 
     <Pty ID="CC" R="22"/> 
      .... 

output.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"> 
     <Batch> 
      <PosRpt> 
       <Pty/> 
       <Pty/> 
       <Pty/> 

Yani dosyanın yapısı doğrudur, ama bu beklendiği gibi boş. Açık bir ad alanı var, bu yüzden sınama giriş dosyasına bu ad alanını eklemeyi denedim, ancak herhangi bir fark yaratmıyor. Sonra fixml nesnesini marshaling etmeden önce yerleştirmeyi deneyeceğim.

Güncelleme 4

ben basit FIXML sınıfını oluşturma ve marhelling öyle görünmüyor.

simple_fxixml_out.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2" cv="DDDD"> 
    <Batch ID="dfddd"> 
     <PositionReportMessageT Ccy="CCC"/> 
    </Batch> 
</FIXML> 

ben denemek ve I geri okunan olsun:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"> 
    <Batch/> 

şeyler bu şunlardır formu not:

  1. oluşturulan ad alanı aynı
  2. PosRpt etiketi yerine PositionReportMessageT oluşturdum
  3. FIXML'deki DDDD özniteliği bile geçişten kurtuluyor.
+1

JAXB nesnesini önce bazı örnek verilerle oluşturmayı ve dosyayı bir dosyaya geçirmeyi deneyin. Yeniden okuduğunuzda bir JAXB nesnesine geri dönüş yapıp yapmadığını görün. Oluşturulan dosyadaki ad alanlarına bakın. – artbristol

+0

Şimdi bu iyi bir fikir. Bir vereceğim (takip etmek için güncelleme). – DUFF

cevap

2

Ben

javax.xml.bind.JAXB sınıf sıralanırken dışarı çalışırken çok yararlıdır kolaylık yöntemlerini içerir (Sana namespaceFilter gerek olduğunu sanmıyorum) Eğer

saxParserFactory.setNamespaceAware(true)

yapmak gerek/unmarshalling, bu arada.

+0

Teşekkürler, dikkat et. – DUFF

0

daha kolay Sonra (aşağıdaki kendi kanıtı kavram basit kodudur) bağlamak ve travers için JAXB kullanmak https://javalibs.com/artifact/com.github.xgp/fixml

(bunu yüklemek için maven kullanabilirsiniz) aşağıdaki FIXML kütüphanesini kullanmak Bulunan:

JAXBContext jaxbContext = JAXBContext.newInstance(FIXML.class); 
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 

    FIXML fixml = (FIXML) unmarshaller.unmarshal(new StringReader(fixmlOrder)); 

    ExecutionReportMessageT er = (ExecutionReportMessageT) fixml.getMessage().getValue(); 
    if(er.getTrdDt() != null){ 
     System.out.println(er.getTrdDt().toGregorianCalendar().getTime()); 
    } 
    System.out.println(ToStringBuilder.reflectionToString(er,ToStringStyle.MULTI_LINE_STYLE));