Jako programista z dużym doświadczeniem i doświadczeniem XML, nigdy wcześniej nie wchodziłam w interakcje z schematami. Po raz pierwszy tak naprawdę dzieje się dla mnie.Sprawdzanie poprawności dokumentów XML z XSD poprawnie
Przebiegłem przez "funkcję", którą uważam za bardziej błędny, który jest dobrze udokumentowany.
Podczas używania XDocument.Validate() wydaje się, że są przypadki, w których dokument będzie ważny, jeśli nie pasuje do określonego schematu. Uważam, że jest to najprawdopodobniej wada mojego rozumienia związku między XSD, przestrzeniami nazw XML i oczekiwanymi procesami walidacji.
Dlatego przesyłam wam moją próbkę XML, próbkę XSD i mój kod weryfikacyjny.
XML - jest to POKUTNIE zły dokument.
<?xml version="1.0" encoding="utf-8" ?>
<SuppliesDefinitions
xmlns="http://lavendersoftware.org/schemas/SteamGame/Data/Xml/Supplies.xsd">
<Supply type="Common">
<Information/>
<Ritual/>
<Weapon/>
<Tool count="1"/>
<Tool count="2"/>
<Tool count="3"/>
</Supply>
<Supply type="Uncommon">
<Information/>
<Weapon/>
<Tool count="1"/>
<Tool count="2"/>
<Tool count="3"/>
<Tool count="4"/>
</Supply>
<Supply type="Rare">
<Information/>
<Rune/>
<Weapon/>
<Tool count="2"/>
<Tool count="3"/>
<Tool count="4"/>
</Supply>
</SuppliesDefinitions>
XSD użyty do sprawdzenia poprawności. (Ponownie, jest to celowo NIEPRAWIDŁOWY dokument dla powyższego XML)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Encounters"
targetNamespace="http://lavendersoftware.org/schemas/SteamGame/Data/Xml/Encounters.xsd"
elementFormDefault="qualified"
xmlns="http://lavendersoftware.org/schemas/SteamGame/Data/Xml/Encounters.xsd"
xmlns:mstns="http://lavendersoftware.org/schemas/SteamGame/Data/Xml/Encounters.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:complexType name="ToolType">
<xs:attribute name="count" use="required" type="xs:int"/>
</xs:complexType>
<xs:complexType name="TaskType">
<xs:choice maxOccurs="unbounded" minOccurs="1">
<xs:element name="Weapon"/>
<xs:element name="Information"/>
<xs:element name="Tool" type="ToolType"/>
<xs:element name="Ritual"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="EncounterType">
<xs:sequence maxOccurs="unbounded" minOccurs="1">
<xs:element name="Task" type="TaskType"/>
</xs:sequence>
<xs:attribute name="name" use="required" type="xs:string"/>
</xs:complexType>
<xs:element name="EncounterDefinitions">
<xs:complexType>
<xs:sequence maxOccurs="unbounded" minOccurs="1">
<xs:element name="Encounter" type="EncounterType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
I na koniec kod weryfikacyjny.
Zastanawiam się, czy ktoś może wyjaśnić, co robię źle. Czuję, że tworzę niepoprawne założenia dotyczące tego, jak to powinno działać. Wydaje mi się, że użycie jednego xsd przeciwko całkowicie niepowiązanemu dokumentowi XML byłoby nieprawidłowe.
Walidacja Xsd zwykle generuje ostrzeżenie, gdy nie można znaleźć pożądanego schematu. Do wyboru są tylko błędy. –
Tak nie jest w tym przypadku, zobacz: http://msdn.microsoft.com/en-us/library/bb354954(v=vs.90).aspx, aby uzyskać szczegółowe informacje na temat XDocument.Validate. To szczególne przeciążenie sprawdzania poprawności spowoduje wychwycenie błędów i ostrzeżeń. –