2012-11-01 3 views
0

가능한 경우 스키마를 결합 할 수있는 Java 라이브러리가 있습니까?XML 스키마 결합

사용자가 정의한 (아마 XML) 데이터 세트에 여러 "생성기"를 연결하고 각 "생성기"에 스키마 (아마도 XSD)가있는 응용 프로그램을 만들면 사용자는 그 스키마에 유효하다면, XSD가 하나로 결합 될 수 있다면 좋을 것입니다 - 그래서 전체 데이터 세트는 모든 Generator의 스키마와 일치하는 결합 된 XSD와 일치 할 것입니다.

XSD가 충돌 할 수 있음을 이해하지만 이는 문제가되지 않지만 완전히 불가능한 경우 다른 해결책은 무엇입니까?

+0

나는 완전히 당신이 뭘하려는 건지 이해하지 않지만, 당신이 include''import'or'사용하여 스키마를 결합 할 수 있습니다 : http://stackoverflow.com/q/2357943/1374678 – rolve

+0

** 카멜레온 스키마 **에 특별한 악센트가 있습니다. 이는 주요 XSD 프로젝트에서조차 간과되기 쉬운 결과를 초래합니다. –

답변

1

실제로 다른 스키마에 "가져온"별도의 XSD를 가질 수 있습니다. 매우 간단합니다. "합성"스키마에서 "import : schemaLocation"을 사용하기 만하면됩니다. 나는이 프로젝트에 사용하고 코드에서 다음 예를 참조하십시오 :이 스키마를 사용하려면

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://test/interactions/AddToContext" 
    xmlns:tns="http://test/interactions/AddToContext" xmlns:basictypes="http://test/interactions/BasicTypes" elementFormDefault="qualified"> 

    <import schemaLocation="BasicTypes.xsd" 
     namespace="http://test/interactions/BasicTypes"> 
    </import> 

    <!-- Request Message --> 
    <element name="AddToContextRequest"> 
     <complexType> 
      <sequence> 
       <choice> 
        <element name="ServiceIdToAdd" type="string" maxOccurs="unbounded" /> 
        <element name="ValueToAdd" type="basictypes:ContextValue" maxOccurs="unbounded" /> 
       </choice> 
      </sequence> 
     </complexType> 
    </element> 

    <!-- Response message --> 
    <element name="AddToContextResponse"> 
     <complexType> 
      <sequence> 
       <element name="Result" type="string" /> 
      </sequence> 
     </complexType> 
    </element> 
</schema> 
당신은 내가이 스키마에 "BasicTypes"스키마를 가져온 것을 볼 수 있습니다

...

이러한 객체를 조작하는 Java 코드 (클래스)를 생성하기위한 참조로 "xjc"(XML 바인딩 컴파일러)을 사용할 수 있습니다. 매우 유용합니다!

도움이 되었기를 바랍니다. 건배!


새로운 XSD의 기본 유형을 결합 :

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://test/interactions/AddToContext" 
    xmlns:tns="http://test/interactions/AddToContext" elementFormDefault="qualified"> 

    <complexType name="ContextValue"> 
     <sequence> 
      <element name="ValueID" type="string" /> 
      <choice> 
       <sequence> 
        <element name="Value" type="string" /> 
        <element name="ID" type="string" /> 
       </sequence> 
       <element name="InfoValue" type="string" /> 
      </choice> 
     </sequence> 
    </complexType> 

    <!-- Request Message --> 
    <element name="AddToContextRequest"> 
     <complexType> 
      <sequence> 
       <choice> 
        <element name="ServiceIdToAdd" type="string" maxOccurs="unbounded" /> 
        <element name="ValueToAdd" type="tns:ContextValue" maxOccurs="unbounded" /> 
       </choice> 
      </sequence> 
     </complexType> 
    </element> 

    <!-- Response message --> 
    <element name="AddToContextResponse"> 
     <complexType> 
      <sequence> 
       <element name="Result" type="string" /> 
      </sequence> 
     </complexType> 
    </element> 
</schema> 
+0

xsds의 구조를 결합하여 네임 스페이스 없이도 작동합니까? 질문의 주석을보십시오. – Philipp

+0

올바르게 이해하면 수행 할 수 있습니다. 가져 오기 대신 결합 된 XSD를 사용하여 편집 된 대답을보십시오. 여기서 "basicTypes : ContextValue"ComplexType을 넣으려는 모든 기본 유형을 포함하는 새 XSD로 복사하면됩니다 함께... – emgsilva