2008-10-09 16 views
5

Tôi cố gắng xác định lược đồ cho các tài liệu XML mà tôi nhận được.Lược đồ XML cho các phần tử có cùng tên nhưng cấu trúc phụ khác nhau tùy thuộc vào ngữ cảnh

Các văn bản như sau:

<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> 

tôi đã cố gắng XmlSpy và xsd.exe từ NET 2.0. Cả hai định nghĩa giản đồ đã tạo cho phép dưới đây <group> bất kỳ số nào của các yếu tố <item><customer>. Nhưng những gì tôi đang tìm kiếm nên hạn chế các yếu tố <group> bên dưới <items> đến <item><group> bên dưới <data> đến <customer> yếu tố.

Đây có phải là thứ gì đó mà lược đồ xml không có khả năng không?

Trả lời

3

Có, XSD có thể xử lý việc này. Tôi tạo ra sơ đồ này từ Visual Studio 2008 (nhanh hơn nhiều so với làm việc đó bằng tay) và nó sẽ làm những gì bạn đang tìm kiếm:

<?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

Không có vấn đề! Vui mừng được giúp đỡ. –

6

Những điểm quan trọng (xem XML Schema Runtime Polymorphism via xsi:type and Abstract Types cho đầy đủ và đúng bối cảnh/vị trí/sử dụng) là:

  1. Tạo một kiểu cơ sở với (trừu tượng = "true" để ngăn chặn nó được sử dụng trực tiếp)

    Lưu ý: thuộc tính ref thay thế thuộc tính tên cho nguyên tố được xác định ở nơi khác

    <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. Tạo hai loại hoặc có nguồn gốc hơn bằng cách mở rộng hoặc hạn chế các loại cơ sở

    <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. tham khảo các loại hình cơ bản trong một yếu tố

    <xs:element name="Customer" type="cust:CustomerType" /> 
    
  4. Trong tài liệu XML của bạn, speci fy loại cụ thể có nguồn gốc như một xsi: Loại thuộc tính

    <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> 
    

    hay:

    <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> 
    
Các vấn đề liên quan