[英]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.