2016-07-01 2 views
1

저는 XML 스키마를 자동으로 생성하고 결과 xsd 파일은 베네 치안 블라인드 디자인 패턴에 따라 생성됩니다. 지금은 복잡한 유형이 많이있어 숫자를 줄이려고합니다. 두 가지 복합 유형이 동일한 제한 사항을 설명하는지 알아내는 쉬운 방법이 있습니까?2 개의 XSComplexType을 비교하여 어떻게 평등합니까?

은 분명히 "someType"와 "someOtherType"
<xs:complexType name="someType"> 
     <xs:choice> 
      <xs:element name="BR" type="xs:string"/> 
      <xs:element name="A" type="xs:string"/> 
     </xs:choice> 
    </xs:complexType> 

    <xs:complexType name="someOtherType"> 
     <xs:choice> 
      <xs:element name="A" type="xs:string"/> 
      <xs:element name="BR" type="xs:string"/> 
     </xs:choice> 
    </xs:complexType> 

동일합니다

여기 내 말은 무엇을 보여주기 위해 예입니다. 이제 두 스키마의 어느 유형이 동등한 지 알아 보겠습니다. XSOM을 사용하여 스키마를 파싱합니다.

import java.io.File; 
import java.io.IOException; 
import java.util.Map; 

import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.SAXException; 

import com.sun.xml.xsom.XSComplexType; 
import com.sun.xml.xsom.XSSchema; 
import com.sun.xml.xsom.XSSchemaSet; 
import com.sun.xml.xsom.parser.XSOMParser; 

public class MyXSOM { 

    public static void main(String[] args) { 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     XSOMParser parser = new XSOMParser(factory); 

     try { 
      parser.parse(new File("schema.xsd")); 
      parser.parse(new File("schema2.xsd")); 

      XSSchemaSet sset = parser.getResult(); 
      XSSchema schema1 = sset.getSchema(0); 
      XSSchema schema2 = sset.getSchema(1); 

      Map<String, XSComplexType> schema1ComplexTypes = schema1.getComplexTypes(); 
      Map<String, XSComplexType> schema2ComplexTypes = schema2.getComplexTypes(); 

      for(XSComplexType currentType1: schema1ComplexTypes.values()){ 
       for(XSComplexType currentType2: schema2ComplexTypes.values()){ 
        // if currentType1 and currentType2 define the same complexType, do s.t. 
       } 
      } 

     } catch (SAXException | IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

두 개의 "complexType"노드간에 이러한 종류의 동등성을 검사하는 우아한 방법이 있습니까?

+1

컴퓨터 과학 이론에서 어려운 문제를 선택하셨습니다. http://math.stackexchange.com/questions/231187/an-efficient-way-to-determine-if-two-context-free-grammars-are-equivalent를 참조하십시오. –

답변

0

좋은 상용품 유형 비교 도구에 대해 알지 못합니다. (어떤 것도 없다는 것을 의미하지는 않습니다.)

두 가지 문맥 - 자유 문법의 동등성 문제를 해결하기 위해 직접 연습 해보십시오 (Michael Kay의 페이스) : 복잡한 유형의 콘텐츠 모델 문맥 - 자유 언어가 아닌 일반 언어를 정의합니다. 이 언어의 원자 기호는 가능한 어린이의 XML 요소 유형 이름입니다 (와일드 카드는 다소 복잡하지만 불충분하지는 않음). 콘텐츠 모델은 기본적으로 해당 언어에 대한 정규 표현식을 정의합니다.

복잡한 유형의 "평등"에 따라 유효 입력과 정확히 동일한 입력 집합을 수락하는지, 정확히 동일한 유형의 출력 결과 트리 (PSVI) 세트를 생성 하는지를 결정해야합니다. 양자 모두.

첫 번째 작업은 비교적 간단합니다. 모든 오토마타 이론 교과서는 정규 표현식에서 유한 상태 오토마타를 작성하는 방법과 두 개의 FSA를 비교하여 두 언어가 동등한지를 비교하는 방법을 설명합니다. (그러나 우아한 방법을 요구하기 때문에, 나는 몇몇 독자에게 더 우아한 것처럼 보이는 그런 업무를위한 대안 방법을 제안하는 Brzozowski 유래 물에 대해서 이야기 한 아주 몇몇 automata 이론 교과서를 관찰 할 것이다.)

출력에서 ​​유형 및 기타 주석의 동등성을 더 확인하려면 언어의 각 기호에 대해 두 가지 복합 유형이 해당 기호가있는 요소에 동일한 유형 또는 동등한 유형을 할당해야합니다 ; 이 XSD 스키마에서 같은 이름의 두 형제 요소에 다른 유형을 할당 할 수 없도록하는 요소 선언 일관성 제약 조건을 통해이 작업을 지원 받게됩니다. (불행하게도, 이름에도 불구하고 동일한 이름의 두 형제가 nillability 나 annotation과 같은 요소 선언의 다른 속성에 대해 동일한 값을 가질 수는 없으며 이것이 버그인지 기능인지에 따라 의견이 다를 수 있습니다)

관련 문제