2012-12-27 74 views
2

問題和主題一樣:在XSD中定義嵌套在同名元素中的元素是否有效?XSD - 元素中嵌套的元素名稱相同 - 是否正確?

作爲一個例子,下面的代碼段是正確的嗎?

<xs:element name="TypeOfAction" minOccurs="0"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="TypeOfAction" minOccurs="0"> 
       <xs:complexType> 
        <xs:simpleContent> 
         <xs:extension base="xs:string"> 
          <xs:attribute name="code" type="xs:string"/> 
         </xs:extension> 
        </xs:simpleContent> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

如果是這樣,你如何讓xjc正確地爲它生成類?我得到編譯錯誤,如靜態類TypeOfAction已經定義(基本上我會得到兩個同名的嵌套靜態類生成)。

回答

5

這段代碼很好。只有全局元素需要具有唯一的限定名稱(名稱空間和本地名稱的組合)。

來自JDK 7的XJC與您的代碼片段正常工作。我的示例XSD生成正確的類。

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="SomeType"> 
     <xs:sequence> 
      <xs:element name="TypeOfAction" minOccurs="0"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="TypeOfAction" 
          minOccurs="0"> 
          <xs:complexType> 
           <xs:simpleContent> 
            <xs:extension base="xs:string"> 
             <xs:attribute name="code" 
              type="xs:string" /> 
            </xs:extension> 
           </xs:simpleContent> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

但它不編譯,因爲Java不允許聲明與外部類相同名稱的內部類。嘗試使用xjc綁定或內聯模式註釋更改生成的類型名稱。你可以找到示例here

樣品直列結合:

... 
<xs:element name="TypeOfAction" 
    minOccurs="0"> 
    <xs:complexType> 
     <xs:annotation> 
      <xs:appinfo> 
       <jaxb:class name="InnerTypeOfAction" /> 
      </xs:appinfo> 
     </xs:annotation> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="code" 
        type="xs:string" /> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 
... 
+0

謝謝你,你把這個努力。這絕對解決了我的問題 –

+0

非常感謝您的回答! –