Muszę sprawdzić poprawność małego fragmentu pliku xml względem schematu. Zasadniczo chciałbym zadać pytanie "Czy element X w dokumencie XML Y jest zgodny z jego typem określonym w schemacie Z?" a jeśli nie, otrzymaj wiadomość opisującą dlaczego. Musi to uwzględniać również ograniczenia nałożone na te typy (np. maxLength, minInclusive).

Czy to możliwe?

4
David Kanarek 21 lipiec 2011, 22:48
Dlaczego nie zweryfikować całego dokumentu? A także czego próbowałeś?
 – 
John Saunders
21 lipiec 2011, 22:52
Interesuje mnie przede wszystkim to, czy dana wartość mieści się w parametrach akceptowalności. Naprawdę nie obchodzi mnie, czy dokument jest ważny. Niczego jeszcze nie próbowałem. Jestem bardzo nowy w .NET, więc poza przeglądaniem dokumentacji nie wiem, od czego zacząć. Moim jedynym pomysłem jest ręczne przeanalizowanie schematu i wyciągnięcie odpowiednich części. Następnie sprawdzam dane pod kątem ograniczeń i zgłaszam wszelkie błędy, ale wygląda na to, że dokładnie to zrobiłby dla mnie walidator.
 – 
David Kanarek
21 lipiec 2011, 22:57
Czy zapoznałeś się z XmlSchema?
 – 
John Saunders
21 lipiec 2011, 22:58
Wygląda na to, że mógłbym użyć XmlSchema do wyszukania deklaracji typu, a następnie ręcznie sprawdzić (jak opisałem powyżej), ale wydaje się, że nie ma żadnej funkcji powyżej reprezentującej schemat jako obiekt. Czy czegoś mi brakuje?
 – 
David Kanarek
21 lipiec 2011, 23:14
Przepraszam. Powinien był skierować Cię do msdn.microsoft.com/en -nas/biblioteka/….
 – 
John Saunders
22 lipiec 2011, 02:45

3 odpowiedzi

Najlepsza odpowiedź

Okazuje się, że było to o wiele łatwiejsze, niż się spodziewałem. Rozwiązaniem było stworzenie nowego schematu, który jako główny zawiera jeden element, który chcę zweryfikować. Po dodaniu tego schematu do zestawu schematów możesz po prostu sprawdzić poprawność fragmentu tak, jak każdy kompletny dokument.

1
David Kanarek 25 lipiec 2011, 18:43

Nie wiem o robieniu tego z C#, ale łatwo to zrobić w XQuery lub XSLT 2.0. W XSLT 2.0 są to:

<xsl:copy-of select="doc('doc.xml')//selected/element" validation="strict"/>

A w XQuery jest to

validate strict {doc('doc.xml')//selected/element}

Wszystko, czego potrzebujesz, to obsługujący schematy procesor XQuery lub XSLT 2.0, który działa w wybranym środowisku.

3
Michael Kay 22 lipiec 2011, 00:35
Dziękuję. Niestety, o ile wiem, żadna z nich nie jest dostępna w .NET.
 – 
David Kanarek
22 lipiec 2011, 20:49
Istnieje wiele procesorów XQuery i XSLT 2.0, które działają w środowisku .NET, na przykład Saxon i XQSharp — oczywiście żaden z nich nie pochodzi z Microsoftu.
 – 
Michael Kay
23 lipiec 2011, 13:11

Artykuł wiedzy firmy Microsoft, który dokładnie opisuje weryfikację fragmentów XML. To mogłoby się przydać. http://support.microsoft.com/kb/318504

0
djs 22 październik 2014, 20:13