2009-10-18 10 views
5

Szukam narzędzia, które powie mi, że nie można sprawdzić poprawności schematu XML. Wszystkie inne narzędzia, na które patrzyłem, po prostu powiedz mi pierwszą parę, a potem muszę je naprawić, zanim będą mi mówić kolejne błędy. Zdaję sobie sprawę, że niektóre błędy mogą być zależne od innych węzłów znajdujących się w różnych zamówieniach, ale rzeczy takie jak źle sformatowane typy danych powinny być zgłaszane, nawet jeśli węzły są w niewłaściwej kolejności.Pełna weryfikacja schematu XML

Przeglądałem już inne narzędzia sugerujące inne pytania tutaj, a wszystkie one kończą się po pierwszej awarii. Jeśli więc jedno z tych narzędzi zrobi to, co chcę, proszę daj mi znać, jak to zrobić.

Biblioteka programistyczna lub technika, która pozwoli mi to zrobić w .NET lub Delphi będzie działać.

Odpowiedz

3

używam XMLNotepad dużo. (Nie wiem, czy już go wypróbowałeś.)

Jest wolny i dobrze radzi sobie z jednoczesnym zgłaszaniem wielu błędów, pod warunkiem, że są niezależne i nie są terminalami! Mniej więcej tak samo, jak błędy kompilatora w Delphi: po uruchomieniu na fałszywym torze wszystko, co następuje, jest często nonsensem.

Zresztą, to bardzo dobrze dla mnie, aby potwierdzić przed dość intricated schematów jak TVB 3.2 ...

+0

Musisz zainstalować wtyczkę XMLtools, ale wygląda na to, że działa świetnie, dzięki! http://sourceforge.net/projects/npp-plugins/ –

+0

OxygenXML też to robi - prawdopodobnie nawet lepiej. Zrobiłem pełny opis w innej odpowiedzi. –

2

Problem polega na tym, że schemat XML definiuje język dokumentu XML. Walidator następnie próbuje "skompilować" dokument XML z tą specyfikacją językową.

Dla większości kompilatorów posiadających ustalone języki (jak Delphi lub C#), zajęło sporo czasu, aby stać się wystarczająco zrelaksowanym, aby zgłosić więcej niż jeden błąd.

Schematy XML są bardziej dynamicznym językiem, więc szacuję, że producenci narzędzi walidacji mogliby jeszcze dłużej wysyłać wiadomości na tyle, by zgłaszać więcej niż jeden błąd, lub kontynuować po pierwszym błędzie.

Nie jestem pewien jakichkolwiek produktów w ten sposób, ale istnieje kilka patentów na rzeczy, które mogą go zrobić: http://www.faqs.org/patents/app/20080228810 i http://www.faqs.org/patents/app/20080229292

Uwaga te zostały złożone w 2008 roku!

--jeroen

1

Myślę, że problemem jest to, że raz schemat jest nieprawidłowy dla każdego z jednego powodu, cokolwiek, co następuje, jest zawodna więc wszelkie dalsze niepowodzenia walidacji może być mylące. Konieczność przeprowadzenia walidacji wykraczającej poza "ten dokument jest ważny" jest prawdopodobnie zbyt specjalistyczną potrzebą, aby przyciągnąć zainteresowanie narzędziami firm.

Z punktu widzenia walidatora dla większości zastosowań, do których zostanie zastosowany, nie ma sensu kontynuować sprawdzania po wystąpieniu awarii. Dokument nie może stać się nieważniejszy niż już jest i nie może zostać uznany za ważny, jeśli zostanie uznany za nieważny.

Może warto zrozumieć, dlaczego chcesz to zrobić?

np. jeśli próbujesz sformatować dokument w celu dostosowania go do schematu, istnieją narzędzia, które powinny generować przykładową instancję dokumentu z danego schematu, aby działał jako referencja lub przykład/szablon.

2

Ten kod w języku C# powinien to zrobić - zeskanuje cały plik XML i zweryfikuje go względem podanego XSD, a także wypisze wszystkie błędy sprawdzania poprawności (lub błędy w schemacie!), Jak to się dzieje. Mam nadzieję że to pomoże!

Sposób korzystania byłoby:

MyXmlValidator (name of XML file) (name of XSD file) 

To wszystko tam jest!

Marc


static void Main(string[] args) 
    { 
     ShowTitle(); 

     if(args.Length < 2) 
     { 
      ShowUsage(); 
      return; 
     } 

     string xmlFileName = args[0]; 
     string xsdFileName = args[1]; 

     if(!File.Exists(xmlFileName)) 
     { 
      ShowError(string.Format("XML File '{0}' does not exist)", xmlFileName)); 
      return; 
     } 

     if (!File.Exists(xsdFileName)) 
     { 
      ShowError(string.Format("XSD schema '{0}' does not exist)", xsdFileName)); 
      return; 
     } 

     StreamReader xsdReader = new StreamReader(xsdFileName); 

     XmlSchema Schema = new XmlSchema(); 
     Schema = XmlSchema.Read(xsdReader, new ValidationEventHandler(XSDValidationEventHandler)); 

     XmlReaderSettings ReaderSettings = new XmlReaderSettings();  
     ReaderSettings.ValidationType = ValidationType.Schema;     
     ReaderSettings.Schemas.Add(Schema); 

     ReaderSettings.ValidationEventHandler += new ValidationEventHandler(XMLValidationEventHandler); 

     XmlTextReader xmlReader = new XmlTextReader(xmlFileName); 
     XmlReader objXmlReader = XmlReader.Create(xmlReader, ReaderSettings); 

     while (objXmlReader.Read()) 
     { } 

     Console.WriteLine("Successful validation completed!"); 
    } 

    private static void XSDValidationEventHandler(object sender, ValidationEventArgs e) 
    { 
     Console.WriteLine("Error reading XSD: " + e.Message); 
    } 

    private static void XMLValidationEventHandler(object sender, ValidationEventArgs e) 
    { 
     Console.WriteLine("Validation error: " + e.Message); 
    } 

    private static void ShowError(string message) 
    { 
     Console.WriteLine("ERROR: " + message); 
    } 

    private static void ShowUsage() 
    { 
     Console.WriteLine("USAGE: GaraioXmlValidator (name of XML file) (name of XSD file)" + Environment.NewLine); 
    } 

    private static void ShowTitle() 
    { 
     Console.WriteLine("GaraioXmlValidator v1.0 (c) 2008 by Garaio Technology Lab" + Environment.NewLine); 
    } 
+0

Kilka miesięcy temu wypróbowałem bardzo podobne rozwiązanie: nawet ten przestaje dużo wcześniej niż Jim lubi. –

+0

Znacie mnie za dobrze, Jeroen. –

1

odkryłem że OxygenXML editor robi bardzo dobrą robotę to za dobrze. Jest to komercyjny edytor, ale sprawdzanie poprawności odbywa się za pomocą Xerces engine, aby wykonać sprawdzanie poprawności (z opcją korzystania z innych). Próbowałem Xerces wcześniej i nie mogłem go zgłosić po pierwszym błędzie, ale oni mówią, że wymuszają aby kontynuować raportowanie. Wykonuje naprawdę dobrą robotę.

XMLSpy oficjalnie nie obsługuje tego pod numerem. Opierając się na tym, co zobaczyłem w dwóch edytorach, lubię OxygenXML znacznie lepiej niż XMLSpy, nie tylko dla tej funkcji (co jest naprawdę miłe, tak jak to robi).

+0

oXygen to świetne narzędzie. Nie wiem, jak zrobiliśmy bez niego XSD. Dodatkowo generuje dokumentację schematu jakości. – Gerard