2012-07-01 11 views
5

Với schema (ẩn danh, những điểm mấu chốt quan tâm được đổi tên và phần còn lại bỏ qua):Tại sao XDocument này không xác thực?

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="inspec" 
    targetNamespace="the_right_namespace" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
    <xs:element name="inspec"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element name="a_scalar_property" type="xs:int"/> 
     <xs:element name="a_collection_property"> 
      <xs:complexType> 
      <snip> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="another_collection_property"> 
      <xs:complexType>     
      <snip> 
      </xs:complexType> 
     </xs:element>      
     </xs:all> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

và ví dụ (tuyên bố sử dụng literals VB xml):

Dim xDocument = 
<x:inspec xmlns:x='the_right_namespace'> 
<a_collection_property/> 
<another_collection_property/> 
</x:inspec> 

xác nhận thất bại với tin nhắn The element 'inspec' in namespace 'the_right_namespace' has incomplete content. List of possible elements expected: 'a_scalar_property'.

Tại sao? Phần tử all, theo W3Schools:

"Phần tử tất cả chỉ định rằng các phần tử con có thể xuất hiện theo thứ tự bất kỳ và mỗi phần tử con có thể xảy ra không hoặc một lần".

Bỏ qua a_scalar_property cũng giống như bao gồm 0 lần. Tại sao tài liệu này không xác thực?

Và đừng nói những thứ như 'đăng toàn bộ mã' - đây không phải là IP của tôi và tôi đã ẩn danh nó vì một lý do chính đáng. Có rất ít khác với nó, và tôi đã thử nghiệm với ví dụ tối thiểu này, nó cho kết quả tương tự.

+0

liên quan: (. Tôi không nói rằng họ sẽ nhất thiết phải là sai trong trường hợp này) http://w3fools.com/ – JJJ

+0

Cảm ơn - Tôi đã không tìm thấy W3Schools được sử dụng nhiều, nhưng bao gồm nó như là một tham chiếu mà có lẽ mọi người đã nghe nói - và bạn thực sự hy vọng câu đầu tiên trên trang về một mảnh cơ bản của Lược đồ Xml sẽ chính xác! –

Trả lời

6

Bạn cần phải xác định minOccurs="0" cho mỗi yếu tố bắt buộc trong xs:all:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="inspec" 
    targetNamespace="the_right_namespace" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
    <xs:element name="inspec"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="a_scalar_property" type="xs:int" minOccurs="0" /> 
       <xs:element name="a_collection_property" minOccurs="0"> 
        <xs:complexType> 
         <!-- snip --> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="another_collection_property" minOccurs="0"> 
        <xs:complexType> 
         <!-- snip --> 
        </xs:complexType> 
       </xs:element> 
      </xs:all> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

Cảm ơn. Có vẻ ngu ngốc mà tôi phải bận tâm - điểm của ' 'là gì nếu tôi vẫn phải chú giải từng phần tử? Tuy nhiên, giải quyết vấn đề. –

+0

Rất vui được trợ giúp. 'xs: all' chỉ giải quyết phần" theo bất kỳ thứ tự nào "... và bạn có lẽ vẫn còn để gặp những niềm vui khi bạn cần" bất kỳ thứ tự nào "VÀ" không, một hoặc nhiều ". – Filburt

2

Để tạo thành phần tùy chọn, thuộc tính minOccurrs phải là 0, ngay cả trong một nhóm < tất cả>. Hiểu rằng từ việc đọc đặc tả lược đồ XML thực sự rườm rà, nhưng dựa vào w3schools không phải là một lựa chọn tốt.

+0

[Tài liệu trên MSDN] (http://msdn.microsoft.com/en-us/library/ms256182) là gây hiểu nhầm theo cùng một cách: * "Cho phép các thành phần trong nhóm xuất hiện (hoặc không xuất hiện) theo bất kỳ thứ tự nào trong phần tử có chứa. "* – Filburt