我正在使用JAXB
封送在以下三种模式中定义的XML
数据:
我还想在JAXB封送处理过程中使用这些模式执行验证;但是,当启用验证时,出现错误:
cvc-complex-type.2.4.c: The matching wildcard is strict,
but no declaration can be found for element 'apphdr:AppHdr'
最外面的标头模式head.003.001.01.xsd看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<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>
这是为BusinessDataHeaderV01
(BizData
)元素生成的Java类:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BusinessDataHeaderV01", namespace = "urn:iso:std:iso:20022:tech:xsd:head.003.001.01", propOrder = {"hdr","pyld"})
public class BusinessDataHeaderV01 {
@XmlElement(name = "Hdr", namespace = "urn:iso:std:iso:20022:tech:xsd:head.003.001.01", required = true)
protected BusinessApplicationHeaderEnvelope hdr;
@XmlElement(name = "Pyld", namespace = "urn:iso:std:iso:20022:tech:xsd:head.003.001.01", required = true)
protected StrictPayload pyld;
// (...)
为BusinessApplicationHeaderEnvelope
类型生成的Java类允许Hdr
字段中的任何Object,这是第二个模式中的AppHdr
元素应到达的位置,看起来像这样:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BusinessApplicationHeaderEnvelope", namespace = "urn:iso:std:iso:20022:tech:xsd:head.003.001.01", propOrder = {"any"})
public class BusinessApplicationHeaderEnvelope {
@XmlAnyElement(lax = true)
protected Object any;
// (...)
Hdr
元素引用第二个模式head.001.001.01.xsd,其中包含AppHdr
根元素:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:iso:std:iso:20022:tech:xsd:head.001.001.01">
<xs:element name="AppHdr" type="BusinessApplicationHeaderV01"/>
<!-- (...) -->
其生成的Java类如下:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BusinessApplicationHeaderV01", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01", propOrder = { "charSet", "fr", "to", "bizMsgIdr", "msgDefIdr", "bizSvc", "creDt", "cpyDplct", "pssblDplct", "prty", "sgntr", "rltd" })
public class BusinessApplicationHeaderV01 {
@XmlElement(name = "CharSet", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01")
protected String charSet;
@XmlElement(name = "Fr", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01", required = true)
protected Party9Choice fr;
@XmlElement(name = "To", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01", required = true)
protected Party9Choice to;
@XmlElement(name = "BizMsgIdr", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01", required = true)
protected String bizMsgIdr;
@XmlElement(name = "MsgDefIdr", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01", required = true)
protected String msgDefIdr;
@XmlElement(name = "BizSvc", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01")
protected String bizSvc;
@XmlElement(name = "CreDt", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01", required = true)
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar creDt;
@XmlElement(name = "CpyDplct", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01")
@XmlSchemaType(name = "string")
protected CopyDuplicate1Code cpyDplct;
@XmlElement(name = "PssblDplct", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01")
protected Boolean pssblDplct;
@XmlElement(name = "Prty", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01")
protected String prty;
@XmlElement(name = "Sgntr", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01")
protected SignatureEnvelope sgntr;
@XmlElement(name = "Rltd", namespace = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01")
protected BusinessApplicationHeader1 rltd;
// (...)
第三个架构用于进入
Pyld
的有效载荷内容 第一个架构的元素,但这与此处无关。
我认为问题在于marshaller
不了解AppHdr
元素或关联的架构,因为在生成的JAXB类中的架构之间似乎没有联系。>
我尝试在第一个模式的软件包中的package-info.java
文件中声明第二个头模式,以建立连接,但这无济于事:
@XmlSchema(
namespace = "urn:iso:std:iso:20022:tech:xsd:head.003.001.01",
elementFormDefault = XmlNsForm.QUALIFIED,
location = "urn:iso:std:iso:20022:tech:xsd:head.003.001.01"
+ " urn:iso:std:iso:20022:tech:xsd:head.001.001.01",
xmlns = {
@XmlNs(
prefix = "bizdata",
namespaceURI = "urn:iso:std:iso:20022:tech:xsd:head.003.001.01"
),
@XmlNs(
prefix = "apphdr",
namespaceURI = "urn:iso:std:iso:20022:tech:xsd:head.001.001.01"
)
}
)
package model.xml.fma.esma.header.bizdata;
import javax.xml.bind.annotation.XmlNs;
// (...)
但是,我仍然遇到相同的架构验证错误。我宁愿避免对生成的JAXB类进行更改(如果可能的话),而是通过调整package-info.java
文件来解决此问题(每个模式我都有一个单独的package-info.java
文件,因为JAXB每个类都位于不同的包中)。如果这是绝对不可避免的,我也将感谢涉及更改生成的JAXB类的解决方案。
我还有一个最小的工作示例,除去了我项目中大多数不相关的代码,但是它太大了,无法在此处发布所有代码(因为所有生成的XML类等等)。但是,如果此处的信息不足,并且有人想看一下,我可以将其发送出去。
非常感谢,很抱歉提出这个问题!
-编辑:
XML的标头部分(我删除了“文档”内容,即有效内容部分)如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bizdata:BizData xmlns:apphdr="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" xmlns:report="urn:iso:std:iso:20022:tech:xsd:auth.072.001.01" xmlns:bizdata="urn:iso:std:iso:20022:tech:xsd:head.003.001.01">
<bizdata:Hdr>
<apphdr:AppHdr>
<apphdr:Fr>
<apphdr:OrgId>
<apphdr:Id>
<apphdr:OrgId>
<apphdr:Othr>
<apphdr:Id>XXXX</apphdr:Id>
</apphdr:Othr>
</apphdr:OrgId>
</apphdr:Id>
</apphdr:OrgId>
</apphdr:Fr>
<apphdr:To>
<apphdr:OrgId>
<apphdr:Id>
<apphdr:OrgId>
<apphdr:Othr>
<apphdr:Id>YY</apphdr:Id>
</apphdr:Othr>
</apphdr:OrgId>
</apphdr:Id>
</apphdr:OrgId>
</apphdr:To>
<apphdr:BizMsgIdr>123456</apphdr:BizMsgIdr>
<apphdr:MsgDefIdr>auth.072.001.01</apphdr:MsgDefIdr>
<apphdr:CreDt>2019-07-03T19:57:37Z</apphdr:CreDt>
</apphdr:AppHdr>
</bizdata:Hdr>
<bizdata:Pyld>
<report:Document>
<!-- (...) -->
</report:Document>
</bizdata:Pyld>
</bizdata:BizData>
-编辑2:
有关该问题的解决方案,请参阅下面的评论!