2012-03-30 203 views
34

我想知道定義包含屬性和子元素(如果可能)的元素的正確語法。例如:具有屬性和子元素的XSD元素

<component type="A" binding="B"> 
    <operation name="X"> 
    <input type="C" /> 
    </operation> 

    <event name="Y"> 
    <output type="D" /> 
    </event> 
</component> 

如您所見,元素組件,操作和事件都具有屬性和子元素。可以在XSD中定義這個嗎?怎麼樣?

非常感謝!

回答

35

這是定義與您的XML匹配的XSD的一種可能方式;學習XSD時,您可以從一個或多個XML示例文件開始註冊一個工具的幫助,該工具可爲您推演XSD。

<?xml version="1.0" encoding="utf-8"?> 
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)--> 
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="component"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="operation"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="input"> 
       <xsd:complexType> 
        <xsd:attribute name="type" type="xsd:string" use="required" /> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      <xsd:attribute name="name" type="xsd:string" use="required" /> 
      </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="event"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="output"> 
       <xsd:complexType> 
        <xsd:attribute name="type" type="xsd:string" use="required" /> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      <xsd:attribute name="name" type="xsd:string" use="required" /> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
     <xsd:attribute name="type" type="xsd:string" use="required" /> 
     <xsd:attribute name="binding" type="xsd:string" use="required" /> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

如你演練此,可能會開始調整分鐘/ maxOccurs的,使用(需要/可選),再利用定義等所產生的XSD是一個很好的起點,但通常最終被編輯的一種方式或另一...

+24

我認爲它的要求'XSD:sequence'到來之前'XSD:attribute's。 – 2014-01-28 18:43:57

+5

是的,正好與你期望的相反,因爲在實際的xml中,屬性出現在元素之前。 – 2014-03-18 02:12:10

+4

來自XML Schema設計師的糟糕的設計決策,使得XSD更難以閱讀,除了直觀。 complexType中應該允許以任何順序放置屬性和順序等 – 2014-09-26 03:26:13

3

我給下面,一個可行的解決方案:

<xs:simpleType name="inputTypeType"> 
     <xs:restriction base="xs:string" /> 
</xs:simpleType> 

<xs:complexType name="inputType"> 
    <xs:attribute name="type" type="inputTypeType"/>    
</xs:complexType> 

<xs:simpleType name="operationNameType"> 
     <xs:restriction base="xs:string" /> 
</xs:simpleType> 

<xs:complexType name="operationType"> 
    <xs:sequence> 
    <xs:element name="input" type="inputType" /> 
    </xs:sequence> 
    <xs:attribute name="name" type="operationNameType"/> 
</xs:complexType> 



<xs:simpleType name="outputTypeType"> 
     <xs:restriction base="xs:string" /> 
</xs:simpleType> 

<xs:complexType name="outputType"> 
    <xs:attribute name="type" type="outputTypeType"/>   
</xs:complexType> 

<xs:simpleType name="eventNameType"> 
     <xs:restriction base="xs:string" /> 
</xs:simpleType> 

<xs:complexType name="eventType"> 
    <xs:sequence> 
    <xs:element name="output" type="outputType" /> 
    </xs:sequence> 
    <xs:attribute name="name" type="eventNameType"/> 
</xs:complexType> 


<xs:simpleType name="typeType"> 
     <xs:restriction base="xs:string" /> 
</xs:simpleType> 

<xs:simpleType name="bindingType"> 
     <xs:restriction base="xs:string" /> 
</xs:simpleType> 




<xs:complexType name="componentType"> 
    <xs:sequence>   
     <xs:element name="operation" type="operationType" /> 
     <xs:element name="event" type="eventType" /> 
    </xs:sequence> 
    <xs:attribute name="type" type="typeType"/> 
    <xs:attribute name="binding" type="bindingType"/>  
</xs:complexType> 


<xs:element name="component" type="componentType" /> 

相關問題