2013-10-30 55 views
1

我有以下兩個元素,product和customerAccount。在xsd中如何重新聲明不同的組元素

該產品具有以下結構,有兩個元素,productSerialNumber和serviceGuidingIdentifer

<xs:element name="product"> 
    <xs:complexType> 
    <xs:sequence> 
    <xs:element name="productSerialNumber" type="xs:string" /> 
    <xs:element name="serviceGuidingIdentifer"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="ID" type="xs:string" /> 
      <xs:element name="type" type="xs:string" /> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    </xs:sequence>                  
</xs:complexType> 
</xs:element> 

客戶賬戶結構如下

<xs:element name="customerAccount"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="ID"type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 

現在我想有一個用戶可以只聲明以上三個元素中的一個,即 1)productSerialNu MBER OR 2)serviceGuidingIdentifer OR 3)customerAccount

每當我試圖申報的選擇,我面對錯誤說要麼未找到要素或元素的定義不一致。

我曾嘗試以下選擇申報

<xs:choice> 
    <xs:element ref="tns:productSerialNumber"/> 
    <xs:element ref="tns:serviceGuidingIdentifer"/> 
    <xs:element ref="tns:customerAccount"/> 
</xs:choice> 

什麼是重新宣佈在選擇不同組元素的正確途徑。

任何幫助將非常感激

感謝和問候, 開發

回答

1

至少有兩個您的元素都不是頂級,所以你不能「裁判」他們。以下模式有效(在Eclipse中):

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

    <xs:element name="product"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="tns:productSerialNumber" /> 
       <xs:element ref="tns:serviceGuidingIdentifer" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="productSerialNumber" type="xs:string" /> 
    <xs:element name="serviceGuidingIdentifer"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="ID" type="xs:string" /> 
       <xs:element name="type" type="xs:string" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="customerAccount"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="ID" type="xs:string" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="choice-element"> 
     <xs:complexType> 
      <xs:choice> 
       <xs:element ref="tns:productSerialNumber" /> 
       <xs:element ref="tns:serviceGuidingIdentifer" /> 
       <xs:element ref="tns:customerAccount" /> 
      </xs:choice> 
     </xs:complexType> 
    </xs:element> 
</schema> 
+0

它必須注意的是** **所有頂級元素,可以有效地用作基於該模式,這可能會或可能不會是OP想要的文檔中的根元素。 – 2013-10-30 22:44:17

+0

謝謝你的快速回復。可悲的部分是,我正在使用soapUI,它在加載時拋出一個錯誤,指出中所有引用的「找不到元素」。我認爲解析它時不考慮命名空間。我們將使用soapUI,所以我不太確定什麼可以使UI正確解析 – user2939206

0

如果將它們定義爲複雜類型,則可以改爲ref類型。

<?xml version="1.0" encoding="utf-16"?> 
<xs:schema xmlns="http://Scratch.Product" targetNamespace="http://Scratch.Product" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="product"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:choice minOccurs="0"> 
       <xs:element name="productSerialNumber" type="xs:string" /> 
       <xs:element name="serviceGuidingIndetifier" type="serviceGuidingIdentiferType" /> 
       <xs:element name="customerAccount" type="customerAccountType" /> 
       </xs:choice> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:complexType name="serviceGuidingIdentiferType"> 
    <xs:sequence> 
     <xs:element name="ID" type="xs:string" /> 
     <xs:element name="type" type="xs:string" /> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="customerAccountType"> 
    <xs:sequence> 
     <xs:element name="ID" type="xs:string" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema>