在JAXB编组期间根据其架构验证包含“ xs:any”元素的XML

时间:2019-07-03 17:12:04

标签: java xml xsd jaxb

我正在使用JAXB封送在以下三种模式中定义的XML数据:

    xml文档标题中的
  • 数据是在两个模式中定义的
  • 有效载荷数据在单个架构中定义
  • Java JAXB类是使用模式生成的

我还想在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>

这是为BusinessDataHeaderV01BizData)元素生成的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:

  

有关该问题的解决方案,请参阅下面的评论!

0 个答案:

没有答案