Pentaho PDI 9.3 XML校验报错cvc-complex-type.2.4.c求助
问题详情
使用Pentaho PDI 9.3的XML验证组件(转换)校验XML文件时,返回错误:
cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'AppHdr'
XML中的AppHdr属于head.001.001.01命名空间,将所有XML和XSD文件放在同一目录时,Notepad++可以正常校验通过,但PDI未提供更多错误细节。
相关代码
XML文件(head.003)
<?xml version="1.0" encoding="UTF-8"?> <BizData xmlns="urn:iso:std:iso:20022:tech:xsd:head.003.001.01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Hdr > <AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:head.001.001.01 head.001.001.01.xsd"> <Fr > <OrgId> <Id> <OrgId> <Othr> <Id>DMBOS</Id> <SchmeNm> <Cd>COD</Cd> </SchmeNm> <Issr>Issr</Issr> </Othr> </OrgId> </Id> </OrgId> </Fr> <To > <OrgId> <Id> <OrgId> <Othr> <Id>DMBOS</Id> <SchmeNm> <Cd>COD</Cd> </SchmeNm> <Issr>Issr</Issr> </Othr> </OrgId> </Id> </OrgId> </To> <BizMsgIdr >BizMsgIdr</BizMsgIdr> <MsgDefIdr >MsgDefIdr</MsgDefIdr> <CreDt >2024-01-12T15:10:50.073Z</CreDt> </AppHdr> </Hdr> <Pyld > <Document xmlns="urn:iso:std:iso:20022:tech:xsd:auth.108.001.01" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:auth.108.001.01 auth.108.001.01.xsd"> <DerivsTradMrgnDataRpt > <RptHdr> <NbRcrds>-418680</NbRcrds> </RptHdr> <TradData> <DataSetActn>NOTX</DataSetActn> </TradData> </DerivsTradMrgnDataRpt> </Document> </Pyld> </BizData>
XSD文件(head.003)
<xs:schema xmlns="urn:iso:std:iso:20022:tech:xsd:head.003.001.01" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:iso:std:iso:20022:tech:xsd:head.003.001.01"> <xs:element name="BizData" type="BusinessDataHeaderV01"/> <xs:complexType name="BusinessApplicationHeaderEnvelope"> <xs:sequence> <xs:any namespace="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" processContents="strict"/> </xs:sequence> </xs:complexType> <xs:complexType name="BusinessDataHeaderV01"> <xs:sequence> <xs:element name="Hdr" type="BusinessApplicationHeaderEnvelope"/> <xs:element name="Pyld" type="StrictPayload"/> </xs:sequence> </xs:complexType> <xs:complexType name="StrictPayload"> <xs:sequence> <xs:any namespace="##any" processContents="strict"/> </xs:sequence> </xs:complexType> </xs:schema>
原因分析
Notepad++会自动读取同目录下xsi:schemaLocation指向的XSD文件,但PDI的XML验证组件默认不会自动加载这些外部依赖的XSD,或者解析器配置限制了本地文件读取,导致无法找到AppHdr元素的定义。
解决方案
1. 显式添加所有依赖XSD到PDI组件
在PDI的XML验证组件设置中,不要仅指定主XSD文件(head.003.001.01.xsd),需将head.001.001.01.xsd和auth.108.001.01.xsd也添加到组件的XSD文件列表中,确保所有依赖的Schema都被加载。
2. 在主XSD中显式引入依赖命名空间
修改head.003的XSD文件,添加xs:import标签引入head.001.001.01命名空间的XSD:
<xs:schema xmlns="urn:iso:std:iso:20022:tech:xsd:head.003.001.01" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:iso:std:iso:20022:tech:xsd:head.003.001.01"> <!-- 新增引入head.001的XSD --> <xs:import namespace="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" schemaLocation="head.001.001.01.xsd"/> <xs:element name="BizData" type="BusinessDataHeaderV01"/> <xs:complexType name="BusinessApplicationHeaderEnvelope"> <xs:sequence> <xs:any namespace="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" processContents="strict"/> </xs:sequence> </xs:complexType> <!-- 其余代码不变 --> </xs:schema>
这样PDI加载主XSD时会自动尝试加载依赖的XSD文件,注意确保文件路径正确。
3. 检查PDI XML解析器配置
部分XML解析器默认会禁用本地文件读取,需确认PDI使用的解析器是否允许加载本地XSD文件。可以尝试调整组件的高级配置,开启外部实体支持(需注意安全风险,仅在可信环境下操作)。
内容的提问来源于stack exchange,提问作者fifibanana

