2012-11-01 33 views
0

是否有任何Java庫允許在可能的情況下組合模式?我創建了一個應用程序,用戶可以將多個「生成器」鏈接到用戶定義的(可能是XML)數據集,每個「生成器」將有一個模式(可能是XSD),然後用戶可以輸入數據對於該模式是有效的,如果XSD可以很容易地合併爲一個 - 這樣整個數據集將匹配組合的XSD,匹配每個Generator的模式,那將是非常好的。組合XML模式

我知道XSD可能存在衝突,但這不是問題,但如果這是完全不可能的,那麼其他解決方案是什麼?

+0

我不完全明白你想要做什麼,而是你可以結合使用'模式import'or'include': 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代碼(Classes)的參考,您可以使用「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