如何正确验证XML模式的扩展



我正在研究SCTE-224标准XML模式的扩展程序(http://www.scte.org/schemas/224/2015/scte22244.xsd)。该规格允许通过在Metadata元素中包含任何其他名称空间的元素来扩展标准:

<xs:element minOccurs="0" name="Metadata">
  <xs:complexType>
    <xs:sequence>
      <xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

我在自己的名称空间中定义了一些顶级元素,这些元素应该在SCTE-224标准元素内部。例如,bam:Program元素:

<Media id="/media/12345" description="A standard SCTE-224 Media element.">
  <Metadata>
    <bam:Program>
      ... Additional bam-namespaced elements
    </bam:Program>
  </Metadata>
</Media>

我的目标是能够考虑到标准和 bam:元素的元素,以定义我们扩展规格的架构。以下是扩展元素的第一个刺伤,但我不知道如何指定bam:Program元素必须出现在Media/Metadata中。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://specs.bamgrid.com" targetNamespace="http://specs.bamgrid.com" xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:xlink="http://www.w3.org/1999/xlink"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
  <xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>
  <xs:element name="Genres">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Genre">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="type" type="xs:string"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Program">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ProgramDetails" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ProgramDetail" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Title" type="xs:string" minOccurs="0"/>
                    <xs:element name="TitleBrief" type="xs:string" minOccurs="0"/>
                    <xs:element name="TitleSort" type="xs:string" minOccurs="0"/>
                    <xs:element name="Description" type="xs:string" minOccurs="0"/>
                    <xs:element name="DescriptionBrief" type="xs:string" minOccurs="0"/>
                  </xs:sequence>
                  <xs:attribute name="language" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:pattern value="[a-z][a-z]"/>
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="ProgramType" type="xs:string" minOccurs="0"/>
        <xs:element name="Images" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Image" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute ref="xlink:href" use="required"/>
                  <xs:attribute name="height" type="xs:int" use="required"/>
                  <xs:attribute name="width" type="xs:int" use="required"/>
                  <xs:attribute name="type" type="xs:string"/>
                  <xs:attribute name="key" type="xs:string"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element ref="Genres" minOccurs="0"/>
      </xs:sequence>
      <xs:attribute name="contentSource" type="xs:string"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

任何人都可以向我指出正确的方向来描述此扩展模式?

我为##其他名称空间(我们失败的原因)提供了解决方案。

首先,通过实现ValidationEventHandler接口创建处理程序。

package com.packagename.handler;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * @author <tomer.madmon@imaginecommunications.com>
 *
 */
public class SCTE224Handler implements ValidationEventHandler {
    private static final Logger logger = LoggerFactory.getLogger(SCTE224Handler.class);
    @Override
    public boolean handleEvent(ValidationEvent event) {
        if(event.getMessage().contains("##other")){ // means ##other namespace like metadata in SCTE224 
            logger.warn(event.toString());
            return true;    
        }
        logger.error(event.toString());
        return false;
    }
}

然后,设置处理程序和架构,它将起作用。

Unmarshaller unmarshaller = jc.createUnmarshaller();
SCTE224Handler validatorHandler = new SCTE224Handler();
unmarshaller.setSchema(schema);
unmarshaller.setEventHandler(validatorHandler);

最新更新