2012-07-01 14 views
5

Biorąc schemat (anonimowe, kluczowe interesujące są zmieniane, a reszta pominięta):Dlaczego ten dokument XDocument nie sprawdza poprawności?

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

i instancja (zadeklarowanego przy użyciu literały VB XML):

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

uwierzytelnienie nie powiedzie się z wiadomość The element 'inspec' in namespace 'the_right_namespace' has incomplete content. List of possible elements expected: 'a_scalar_property'.

Dlaczego? Element all, zgodnie z W3Schools:

"Element all określa, że ​​elementy podrzędne mogą pojawiać się w dowolnej kolejności i że każdy element podrzędny może wystąpić zero lub jeden raz."

Pominięcie a_scalar_property jest tym samym, co włączenie go zero razy. Dlaczego ten dokument nie sprawdza się?

I nie mów takich rzeczy jak "opublikuj pełny kod" - to nie jest mój adres IP i mam zanonimizowany to z dobrego powodu. Niewiele więcej jest do tego, a ja przetestowałem ten minimalny przykład, daje taki sam rezultat.

+0

dotyczy: (. Nie mówię, że byłoby to złe w tym przypadku) http://w3fools.com/ – JJJ

+0

Dzięki - nie znalazłem W3Schools, który byłby bardzo przydatny, ale zawarłem to jako wzmiankę, o której prawdopodobnie wszyscy słyszeli - i masz nadzieję, że pierwsze zdanie na stronie o podstawowym schemacie Xml byłoby poprawne! –

Odpowiedz

6

Musisz określić minOccurs="0" dla każdego elementu opcjonalnego w 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

Dzięki. Wydaje się głupie, że muszę zawracać sobie głowę - o co chodzi z '' jeśli nadal muszę opisywać każdy element mimo to? Mimo to rozwiązuje problem. –

+0

Cieszę się, że mogę Ci pomóc. 'xs: all' rozwiązuje tylko część" w jakiejkolwiek kolejności "... a ty prawdopodobnie nadal możesz napotkać radości, kiedy potrzebujesz" dowolnej kolejności "I" zero, jeden lub więcej ". – Filburt

2

Aby element był opcjonalny, atrybut minOccurrs powinien wynosić 0, nawet w grupie < wszystkie>. Uzyskanie tego z czytania specyfikacji schematu XML jest naprawdę uciążliwe, ale poleganie na w3schools nie jest dobrą alternatywą.

+0

[Dokumentacja na MSDN] (http://msdn.microsoft.com/en-us/library/ms256182) wprowadza w błąd w ten sam sposób: * "Pozwala elementom w grupie pojawić się (lub nie pojawiają się) w dowolnej kolejności w elemencie zawierającym. "* – Filburt

Powiązane problemy