2008-10-09 58 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> 
    
相关问题