2009-01-06 32 views
17

Đây là câu hỏi về lược đồ XML.XSD - Cách mô tả một tập hợp các loại phần tử không có thứ tự mà phần tử đầu tiên phải xuất hiện đầu tiên trong chuỗi?

Tôi biết rằng phần tử xsd:all không thể xuất hiện theo trình tự (phải là phần tử cấp cao nhất của loại của nó).

Đó là, tôi không thể sử dụng như sau:

<xsd:complexType name="Application"> 
    <xsd:sequence> 
    <xsd:element ref="Name"></xsd:element> 
    <xsd:all> 
     <xsd:element ref="ADD"></xsd:element> 
     <xsd:element ref="DELETE"></xsd:element> 
    </xsd:all> 
    </xsd:sequence> 
</xsd:complexType> 

Câu hỏi của tôi là làm thế nào để khai báo "ADD" và "DELETE" các yếu tố nêu trên trong bất kỳ thứ tự (hổn độn) nhưng vẫn đảm bảo rằng các phần tử "Tên" sẽ là tên đầu tiên và luôn xuất hiện. (Hãy suy nghĩ về tình huống mà tôi không chỉ "ADD" và "DELETE" mà còn khoảng 10 hoặc nhiều phần tử không có thứ tự được đặt: ADD, DELETE, EDIT etc ...)

LƯU Ý QUAN TRỌNG: ADD và DELETE chỉ xuất hiện Một lần, nhưng thứ tự của chúng không quan trọng:

<Application> 
    <NAME> 
    <DELETE> 
    <ADD> 
</Application> 

nhưng kHÔNG:

<Application> 
    <NAME> 
    <DELETE> 
    <ADD> 
    <DELETE> <!--cannot appear twice--> 
</Application> 

Trả lời

17

Nếu tôi hiểu yêu cầu của bạn, bạn đang đi đúng hướng, điều duy nhất bạn đang thiếu là maxOccurs = "vô biên" về sự lựa chọn của bạn.

tôi tạo ra các sơ đồ sau:

<?xml version="1.0"?> 
<xs:schema targetNamespace="http://someNamespace" xmlns="http://someNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Root" type="Application"> 
    </xs:element> 

    <xs:complexType name="Application"> 
    <xs:sequence> 
     <xs:element ref="Name"></xs:element> 
     <xs:choice maxOccurs="unbounded"> 
     <xs:element ref="ADD"></xs:element> 
     <xs:element ref="DELETE"></xs:element> 
     </xs:choice> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:element name="Name"/> 
    <xs:element name="ADD"/> 
    <xs:element name="DELETE"/> 
</xs:schema> 

Và nó làm việc tốt cho

<ns0:Root xmlns:ns0="http://someNamespace"> 
    <ns0:Name /> 
    <ns0:ADD /> 
    <ns0:ADD /> 
    <ns0:DELETE /> 
    <ns0:ADD /> 
    <ns0:DELETE /> 
    <ns0:DELETE /> 
</ns0:Root> 

nhưng không phải cho

<ns0:Root xmlns:ns0="http://someNamespace"> 
    <ns0:ADD /> 
    <ns0:ADD /> 
    <ns0:DELETE /> 
    <ns0:ADD /> 
    <ns0:DELETE /> 
    <ns0:DELETE /> 
</ns0:Root> 
+0

Cảm ơn rất nhiều câu trả lời của bạn. Tôi đã kiểm tra câu hỏi của tôi ở trên. Tôi có nghĩa là ADD và DELETE sẽ không xuất hiện 0 hoặc 1 lần, nhưng thứ tự của chúng không quan trọng. Không thể sử dụng "tất cả" trường hợp này, vì phần tử bắt buộc NAME không thể đi kèm với "tất cả". Bạn có giải pháp nào khác không? Cảm ơn – ogee

+0

Chỉ hoạt động với thuộc tính maxOccurs = "không bị chặn" cho thẻ lựa chọn – Pooya

3

Tôi không tin rằng điều này có thể được thực hiện mà không liệt kê mọi sự kết hợp của ADD, DELETE vv. Nói chung các danh sách không theo thứ tự không hoạt động tốt, hoặc với DTD hoặc sc hemas.

+3

mô tả danh sách không theo thứ tự – lbalazscs

+0

@lbalazscs - Từ câu hỏi "LƯU Ý QUAN TRỌNG: ADD và DELETE chỉ có thể xuất hiện ONCE, nhưng thứ tự của chúng không quan trọng: ". maxOccurs = "không bị chặn" sẽ không phân phối điều đó. – Alohci

+0

Alhoci, vâng, OP muốn một SET không có thứ tự, nhưng DANH SÁCH không có thứ tự vẫn có thể. Tôi đã thêm nhận xét này, bởi vì tôi đã bị nhầm lẫn bởi câu trả lời của bạn (tôi có một vấn đề khác mà các phần tử có thể xuất hiện bất kỳ lúc nào), chỉ để khám phá sau đó các danh sách không có thứ tự là hoàn toàn có thể. – lbalazscs

1

Bạn có thể triển khai danh sách không theo thứ tự bằng cách sử dụng loại chuỗi xs:choice.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="Application"/> 
    <xs:complexType> 
    <xs:element name="NAME"> 
    <xs:sequence> 
    <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element name="ADD" type="xs:string"/> 
     <xs:element name="DELETE" type="xs:string"/> 
    </xs:choice> 
    </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

Bằng cách này bạn hạn chế người dùng từ việc sử dụng bất kỳ thẻ họ muốn bên trong phần tử <NAME/> nhưng cho phép họ sử dụng <ADD/><DELETE/> thường xuyên như họ muốn.

+0

Có phải '' trong đó thực sự cần thiết, trong trường hợp này? – LarsH

+1

@LarsH: Có, vì xs: choice chỉ cho phép chọn một trong các thành phần được liệt kê. xs: sequence ở đây tạo ra một lựa chọn ADD hoặc DELETE. Tuy nhiên, nó không đáp ứng yêu cầu của OP không bao giờ cho phép nhiều hơn một phiên bản ADD và DELETE mỗi lần. –

4

Tôi rất tiếc vì bạn đã gặp vấn đề này trong 7 năm mà không có câu trả lời.

Tôi sẽ trợ giúp bằng cách xem xét lại các giả định của bạn.

Bằng cách xử lý "Tên" như một phần dữ liệu phải đến trước và yêu cầu phải là con của Ứng dụng, và sau đó nói chung bạn không quan tâm đến thứ tự của anh chị em của nó, bạn tạo ra một tình huống khó hiểu cho chính mình. Tại sao Đặt tên cho anh chị em của ADD và DELETE nếu nó tuân theo các quy tắc khác nhau và phục vụ một mục đích khác? Nếu bạn phải mô hình hóa cấu trúc này trong bất kỳ cấu trúc dữ liệu nào khác, bạn sẽ không bao gồm "Tên" trong danh sách những thứ cùng với "ADD" và "DELETE". Bạn sẽ nói hai điều: Một ứng dụng có một tên, và nó cũng có một danh sách các lệnh như ADD và DELETE.

Vì Tên là một điều đặc biệt so với ADD và DELETE, nên nó được mô hình riêng biệt với các thẻ khác. Vì vậy, bạn có thể đặt Tên là thuộc tính của Ứng dụng và giữ Thêm và Xóa làm phần tử con hoặc bạn có thể giữ Tên làm phần tử con nhưng sau đó bao quanh THÊM VÀ XÓA bằng thẻ trình giữ chỗ/nhóm, chẳng hạn như Lệnh . Thẻ Lệnh sẽ là anh chị em duy nhất của Tên.

Đây là lược đồ hỗ trợ Tên dưới dạng thuộc tính, với số lượng lệnh tùy ý theo thứ tự bất kỳ. "Tên như Attribute.xsd":

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Application" type="Application_Type" /> 
    <xs:complexType name="Application_Type"> 
      <xs:all> 
       <xs:element minOccurs="0" ref="ADD"/> 
       <xs:element minOccurs="0" ref="DELETE"/> 
       <xs:element minOccurs="0" ref="THIRD"/> 
       <xs:element minOccurs="0" ref="FOURTH"/> 
      </xs:all> 
      <xs:attribute name="Name"/> 
    </xs:complexType> 
    <xs:element name="ADD"/> 
    <xs:element name="DELETE"/> 
    <xs:element name="THIRD"/> 
    <xs:element name="FOURTH"/> 
</xs:schema> 

Ví dụ XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="text" xsi:noNamespaceSchemaLocation="Name as Attribute.xsd"> 
    <THIRD>text</THIRD> 
    <ADD>text</ADD> 
    <FOURTH>text</FOURTH> 
    <DELETE>text</DELETE> 
</Application> 

Và đây là một với các lệnh lồng nhau trong một thẻ giữ chỗ. "Lệnh Grouping.xsd":

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Application" type="Application_Type"/> 
    <xs:complexType name="Application_Type"> 
     <xs:sequence> 
      <xs:element ref="Name"/> 
      <xs:element name="Commands" type="Commands_Type"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="Commands_Type"> 
     <xs:all> 
      <xs:element minOccurs="0" ref="ADD"/> 
      <xs:element minOccurs="0" ref="DELETE"/> 
      <xs:element minOccurs="0" ref="THIRD"/> 
      <xs:element minOccurs="0" ref="FOURTH"/> 
     </xs:all> 
    </xs:complexType> 
    <xs:element name="Name"/> 
    <xs:element name="ADD"/> 
    <xs:element name="DELETE"/> 
    <xs:element name="THIRD"/> 
    <xs:element name="FOURTH"/> 
</xs:schema> 

Ví dụ XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Commands Grouping.xsd"> 
    <Name>text</Name> 
    <Commands> 
     <THIRD>text</THIRD> 
     <ADD>text</ADD> 
     <FOURTH>text</FOURTH> 
     <DELETE>text</DELETE> 
    </Commands> 
</Application> 

Một lưu ý về hai trong số này là những thông điệp với zero lệnh vẫn còn nhắn hợp lệ. Có lẽ không sao, nhưng nếu đó là một vấn đề, có lẽ việc xác thực đó thuộc về lớp Ứng dụng chứ không phải là XSD.

Các vấn đề liên quan