繁体   English   中英

根据架构 (XSD) 验证 FIXML

[英]Validate FIXML against Schema (XSD)

我正在尝试验证从业务合作伙伴处收到的一些 FIXML 消息,但我无法验证。 我认为应该是命名空间问题,因为解析器不识别根标记 (FIXML)。 有什么想法吗?

非常感谢您的帮助。

Java 模式验证器

static boolean validateAgainstXSD(InputStream xml, InputStream xsd) {
        try {
            SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = factory.newSchema(new StreamSource(xsd));
            Validator validator = schema.newValidator();
            validator.validate(new StreamSource(xml));
            return true;

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

待验证的 FIXML

<?xml version="1.0" encoding="utf-8"?>
<FIXML v="FIX.5.0SP2" xmlns:xs="http://www.fixprotocol.org/FIXML-5-0-SP2">
    <TrdCaptRpt TrdID="32KGWND0000000099@20220411" ExecID="ExecID" TrdDt="2022-04-11" BizDt="2022-04-11" LastUpdateTm="2022-04-11T09:27:23.404Z" LastQty="1" LastPx="101.1" MktSegID="XEUR" LastMkt="XEUR" VenuTyp="E" TrdTyp="0" AsOfInd="0" TransTyp="0" MtchID="1" TrnsfrRsn="004" MLegRptTyp="1" Clrd="0">
        <Hdr SeqNum="2587905699377885" SID="CM1_EU" TID="CM1_EU" Snt="2022-04-11T14:14:59.407564Z" SSub="FIS CD"/>
        <RegTrdID Evnt="2" Typ="0" ID="E01XEURECAGWC00000000000099KGWND0000000002"/>
        <Instrmt Exch="XEUR" Sym="DBK9" CFI="OCXXXN" MatDt="2023-03-31" MMY="202303" PutCall="1" StrkPx="100.0"/>
        <RptSide Side="1" TrdID="32KGWND0000000099" PosEfct="O" CustOrdHdlInst="D">
            <Pty ID="CM1_EU" R="1"/>
            <Pty ID="CLIENT1UK_ACC1_DEFACCREF" R="24"/>
            <Pty ID="A1" R="38"/>
            <Pty ID="CM1_EU" R="4"/>
            <Pty ID="ECAG" R="21"/>
            <Pty ID="TRADER" R="12"/>
            <TrdRegTS TS="2022-04-11T08:18:03.689Z" Typ="1"/>
            <TrdRegTS TS="2022-04-11T14:14:59.391Z" Typ="13"/>
            <TrdRegTS TS="2022-04-11T08:18:03.689Z" Typ="19"/>
            <TrdRptOrdDetl OrdID="ORDERID"/>
        </RptSide>
    </TrdCaptRpt>
</FIXML>

XML 模式验证

<?xml version="1.0" encoding="utf-8"?>

<!-- FIXML Schema Version FIX.5.0SP2 EP240 Generated: 2017-12-29T02:42:44.519Z 
    Copyright(c) FIX Protocol Limited. All rights reserved. Comments and errors 
    should be posted on the FIX protocol web-site http://www.fixtradingcommunity.org -->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"
           xmlns:fm="http://www.fixprotocol.org/FIXML-5-0-SP2/METADATA"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.fixprotocol.org/FIXML-5-0-SP2/METADATA fixml-metadata-5-0-SP2.xsd"
           targetNamespace="http://www.fixprotocol.org/FIXML-5-0-SP2"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
   <xs:include schemaLocation="fixml-tradecapture-base-5-0-SP2.xsd"/>
</xs:schema>

PS:所有包含的架构都在引用所在的同一文件夹中可用,如下所示。

图式

我认为问题是 XML:

<FIXML v="FIX.5.0SP2" xmlns:xs="http://www.fixprotocol.org/FIXML-5-0-SP2">

这将别名xs分配给命名空间http://www.fixprotocol.org/FIXML-5-0-SP2但随后在 xml 中根本没有使用它。因此基本上 xml 不在命名空间中,而根据架构, xml 应该在特定的命名空间http://www.fixprotocol.org/FIXML-5-0-SP2中。 所以要么删除别名:

<FIXML v="FIX.5.0SP2" xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2">

或者像这样在所有元素标签中使用别名:

<xs:FIXML v="FIX.5.0SP2" xmlns:xs="http://www.fixprotocol.org/FIXML-5-0-SP2">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM