我有一个FIXML格式的小型XML文档。我正在使用jaxb解码它们。

问题

该过程完成,没有错误,但是创建的对象完全为空。
每个字段都是空的。列表中的字段(如“数量”)中包含正确数量的对象。但是这些对象的字段也为空。

设置

我已经从here下载了FIXML模式
并且我已经使用xjc和maven插件创建了这些类。它们都在org.fixprotocol.fixml_5_0_sp2包中。
我在文件中有示例xml

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>


然后,我使用自定义事件处理程序调用解码器,该事件处理程序只会在解析错误时引发异常。
解析完成,因此我知道没有错误生成。
我也按照建议的here处理 namespace
// 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);

fixml对象已创建。在上面的示例中,Amt数组将包含五个与文件中的amts数量匹配的元素。
但是像ccy这样的所有字段都为空。我已经在xjc创建的类中放置了断点,并且没有一个 setter 被调用过。

因此,似乎jaxb正在解码并创建所有正确的对象,但从未调用setter?

我对此完全感到困惑。我已经看到了一些建议,以确保由xjc生成的package.info文件在packags中,并且我已经确定它在那里。
IDE中没有有关所生成代码的警告。

任何帮助,不胜感激。

更新
我试图在开始解码之前在解码器上设置架构文件。
Schema schema = sf.newSchema(f);
unmarshaller.setSchema(schema);

我不确定要使用哪种架构,所以我在循环中依次尝试了每个文件。结果是他们都没有使它起作用。它们导致错误,发现从元素“PosRpt”开始的无效内容。

这是令人惊讶的。我现在认为问题与 namespace 有关。

更新2
仍然没有进展。我已经尝试过JAXB 2.0和2.2。现在看不同的Maven插件来调用xjc。但我认为不是那样。

更新3
因此,现在阅读完Fixml后,我会将其整理回一个单独的文件中。
// 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);

结果是:

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

因此,文件的结构是正确的,但是按预期是空的。有一个显式的 namespace ,所以我尝试将该 namespace 添加到测试输入文件中,但这没有任何区别。接下来,我将在编码(marshal)它之前尝试填充fixml对象。

更新4

不是,我正在创建一个简单的FIXML类并将其编码。

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>

当我尝试阅读回去时,我得到:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2">
    <Batch/>

我注意到的是:
  • 生成的 namespace 与
  • 相同
  • 我创建了PositionReportMessageT而不是PosRpt标签
  • 即使FIXML上的DDDD属性也可以幸免于过渡。
  • 最佳答案

    我认为你需要做
    saxParserFactory.setNamespaceAware(true)
    (我认为您不需要namespaceFilter)
    javax.xml.bind.JAXB类包含便捷方法,这些方法在尝试编码/解码时非常有用。

    10-08 14:45