2017-11-24 25 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);