【发布时间】:2012-10-18 07:26:46
【问题描述】:
我有一个 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
// 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 数组将有五个元素,它们与文件中的 amt 数量相匹配。 但是像 ccy 这样的所有字段都是空的。我在 xjc 创建的类中放置了断点,并且没有调用任何设置器。
所以看起来 jaxb 正在解组并创建所有正确的对象,但它从不调用设置器??
我完全被这件事难住了。我看过一些帖子,建议确保 xjc 生成的 package.info 文件在包中,并且我确保它在那里。 IDE 中没有关于生成代码的警告。
非常感谢任何帮助。
更新 在开始解组之前,我尝试在解组器上设置架构文件。
Schema schema = sf.newSchema(f);
unmarshaller.setSchema(schema);
我不确定要使用哪个架构,所以我在循环中依次尝试每个文件。结果是它们都没有使它起作用。它们导致错误 Invalid content was found 从元素 'PosRpt' 开始。
这令人惊讶。我现在认为问题出在一些与命名空间有关。
更新 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/>
所以文件的结构是正确的,但正如预期的那样是空的。有一个明确的命名空间,所以我尝试将该命名空间添加到测试输入文件中,但这没有任何区别。接下来,我将尝试在封送它之前填充 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/>
我注意到的事情是:
- 生成的命名空间是一样的
- 我创建了 PositionReportMessageT 而不是 PosRpt 标记
- 即使是 FIXML 上的 DDDD 属性也能在转换过程中幸存下来。
【问题讨论】:
-
尝试首先使用一些示例数据创建 JAXB 对象,然后将其编组到文件中。查看当您回读时它是否往返返回到 JAXB 对象。查看生成文件上的命名空间。
-
现在这是个好主意。会试一试(后续更新)。
标签: java xml xml-parsing jaxb