2008-10-09 59 views
5

我嘗試爲接收到的XML文檔定義模式。具有相同名稱但具有不同子結構的元素的XML模式取決於上下文

的文件看起來像:

<root> 
    <items> 
     <group name="G-1"> 
      <item name="I-1"/> 
      <item name="I-2"/> 
      <item name="I-3"/> 
      <item name="I-4"/> 
     </group> 
    </items> 
    <data> 
     <group name="G-1" place="here"> 
      <customer name="C-1"> 
       <item name="I-1" count="3"/> 
       <item name="I-2" count="4"/> 
      </customer> 
      <customer name="C-2"> 
       <item name="I-3" count="7"/> 
      </customer> 
     </group> 
    </data> 
</root> 

我試圖XMLSPY和XSD.EXE從.NET 2.0。兩個創建的模式定義都允許在<group>以下任意數量的<item><customer>元素。但我正在尋找的應該限制<group>低於<items><item>元素和<group>低於<data><customer>元素。

這是什麼XML模式根本不能?

回答

3

是的,XSD可以處理這個問題。我從生成的Visual Studio 2008(比手工做它更快)這個模式,它會做你要找的內容:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="items"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="group"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element maxOccurs="unbounded" name="item"> 
         <xs:complexType> 
         <xs:attribute name="name" type="xs:string" use="required" /> 
         </xs:complexType> 
        </xs:element> 
        </xs:sequence> 
        <xs:attribute name="name" type="xs:string" use="required" /> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="data"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="group"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element maxOccurs="unbounded" name="customer"> 
         <xs:complexType> 
         <xs:sequence> 
          <xs:element maxOccurs="unbounded" name="item"> 
          <xs:complexType> 
           <xs:attribute name="name" type="xs:string" use="required" /> 
           <xs:attribute name="count" type="xs:unsignedByte" use="required" /> 
          </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
         <xs:attribute name="name" type="xs:string" use="optional" /> 
         </xs:complexType> 
        </xs:element> 
        </xs:sequence> 
        <xs:attribute name="name" type="xs:string" use="required" /> 
        <xs:attribute name="place" type="xs:string" use="required" /> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

沒問題!樂意效勞。 – 2008-10-09 18:11:10

6

要點(見XML Schema Runtime Polymorphism via xsi:type and Abstract Types完整和正確的上下文/位置/使用)爲:

  1. 創建(抽象=「真」,以防止它被直接用於)

    注基類型:ref屬性替換別處定義

    0123的元件的名稱屬性
    <xs:complexType name="CustomerType" abstract="true" > 
        <xs:sequence> 
        <xs:element ref="cust:FirstName" /> 
        <xs:element ref="cust:LastName" /> 
        <xs:element ref="cust:PhoneNumber" minOccurs="0"/> 
        </xs:sequence> 
        <xs:attribute name="customerID" type="xs:integer" /> 
    </xs:complexType> 
    
  2. 通過延伸或限制的基本類型創建兩個或更多個派生類型

    <xs:complexType name="MandatoryPhoneCustomerType" > 
        <xs:complexContent> 
        <xs:restriction base="cust:CustomerType"> 
         <xs:sequence> 
         <xs:element ref="cust:FirstName" /> 
         <xs:element ref="cust:LastName" /> 
         <xs:element ref="cust:PhoneNumber" minOccurs="1" /> 
         </xs:sequence> 
        </xs:restriction> 
        </xs:complexContent> 
    </xs:complexType> 
    

    <xs:complexType name="AddressableCustomerType" > 
        <xs:complexContent> 
        <xs:extension base="cust:CustomerType"> 
         <xs:sequence> 
         <xs:element ref="cust:Address" /> 
         <xs:element ref="cust:City" /> 
         <xs:element ref="cust:State" /> 
         <xs:element ref="cust:Zip" /> 
         </xs:sequence> 
        </xs:extension> 
        </xs:complexContent> 
    </xs:complexType> 
    
  3. 參考中的一個元素

    <xs:element name="Customer" type="cust:CustomerType" /> 
    
  4. 基類型在您的實例XML文檔中, FY具體派生類型作爲xsi:type屬性

    <cust:Customer customerID="12345" xsi:type="cust:MandatoryPhoneCustomerType" > 
        <cust:FirstName>Dare</cust:FirstName> 
        <cust:LastName>Obasanjo</cust:LastName> 
        <cust:PhoneNumber>425-555-1234</cust:PhoneNumber> 
    </cust:Customer> 
    

    或:

    <cust:Customer customerID="67890" xsi:type="cust:AddressableCustomerType" > 
        <cust:FirstName>John</cust:FirstName> 
        <cust:LastName>Smith</cust:LastName> 
        <cust:Address>2001</cust:Address> 
        <cust:City>Redmond</cust:City> 
        <cust:State>WA</cust:State> 
        <cust:Zip>98052</cust:Zip> 
    </cust:Customer> 
    
相關問題