2017-11-24 10 views
2

私はSCTE-224標準XMLスキーマ(http://www.scte.org/schemas/224/2015/SCTE224.xsd)の拡張に取り組んでいます。 SCTE-224標準的な要素の内側に行くべき私は自分の名前空間にいくつかのトップレベルの要素を定義したXMLスキーマの拡張機能を正しく検証する方法は?

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

:スペックはMetadata要素内の任意の他の名前空間の要素を含むことにより、規格の拡張が可能になります。例えば、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:の両方の要素を取って、私たちの拡張仕様のスキーマを定義して自分のXSDを持ってできるようにすることです。以下は拡張要素の最初のスタブですが、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> 

誰でもこの拡張スキーマを説明するための正しい方向を指摘できますか?

+0

なぜ必要な親要素を指定したいのですか?私はそれが可能だとは思わないが、理由を見ていない。 – daniu

+0

@ daniu - ' 'エレメントは、''の中の' 'エレメントをシステム内で有効にする必要があるためです。 – Jared

+1

私はあなたがする必要があると思うのは、 'Program'子を必要とする拡張' Media'要素を追加し、それを検証のために使用することです。これは 'Media'以外の名前空間にありますが、xsltを使ってXML文書を新しい名前空間に変換して検証することができます。 – daniu

答えて

0

私は他の名前空間のための解決策、私たちの失敗の理由があります。

まず、ValidationEventHandlerインターフェイスを実装してハンドラを作成します。

package com.packagename.handler; 

import javax.xml.bind.ValidationEvent; 
import javax.xml.bind.ValidationEventHandler; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

/** 
* @author <[email protected]> 
* 
*/ 
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); 
関連する問題