2009-10-18 14 views
5

Sto cercando uno strumento che indicherà tutti gli errori di convalida dello schema XML. Tutti gli altri strumenti che ho visto così mi dicono la prima coppia, e poi devo correggerli prima che mi dica i prossimi errori. Mi rendo conto che alcuni errori possono dipendere da altri nodi che si trovano in ordini diversi, ma cose come i tipi di dati che vengono formattati in modo errato dovrebbero poter essere segnalati anche se i nodi sono nell'ordine sbagliato.Convalida schema XML completa

Ho già controllato gli altri strumenti suggeriti per altre domande qui e si fermano tutti dopo il primo errore. Quindi, se uno di questi strumenti farà quello che voglio, quindi fammi sapere i passaggi per farlo.

Una libreria di programmazione o una tecnica che mi consenta di farlo in .NET o Delphi funzionerebbe.

risposta

3

Io uso XMLNotepad un sacco. (Non so se l'hai già provato.)

È gratuito e fa un buon lavoro nel segnalare un sacco di errori contemporaneamente, purché siano indipendenti e non terminali! Circa allo stesso modo degli errori del compilatore in Delphi: una volta avviato su una traccia falsa tutto ciò che segue è spesso privo di senso.

In ogni caso, ha funzionato molto bene per me per convalidare contro schemi abbastanza intricated come la TVB 3.2 ...

+0

Devi installare il plug-in XMLtools, ma sembra funzionare bene, grazie! http://sourceforge.net/projects/npp-plugins/ –

+0

OxygenXML fa anche questo, probabilmente anche meglio. Ho fatto un resoconto completo su di esso in un'altra risposta. –

2

Il problema è che uno schema XML definisce la lingua per il documento XML. Il validatore quindi cerca semplicemente di "compilare" il documento XML con quella specifica del linguaggio.

Per la maggior parte dei compilatori che hanno lingue fisse (come Delphi o C#), è necessario un po 'di tempo per essere sufficientemente rilassati per poter segnalare più di un errore.

Gli schemi XML sono più simili a un linguaggio dinamico, quindi ritengo che i fornitori di strumenti di convalida impieghino ancora più tempo per renderli sufficientemente rilassati da riportare più di un errore o continuare dopo il primo errore.

non sono sicuro di tutti i prodotti che fanno questo, ma ci sono alcuni brevetti depositati per le cose che potrebbero farlo: http://www.faqs.org/patents/app/20080228810 e http://www.faqs.org/patents/app/20080229292

Nota queste sono state depositate nel 2008!

--jeroen

1

Credo che il problema è che una volta che uno schema è valido per un qualsiasi motivo, tutto il resto che segue è inaffidabile così eventuali ulteriori errori di convalida potrebbe essere fuorviante. La necessità di eseguire la convalida oltre "questo documento è valido" è forse una necessità troppo specializzata per attirare l'interesse delle società di strumenti.

Dal punto di vista di un validatore per la maggior parte degli usi a cui verrà sottoposto, non ha senso continuare la convalida una volta rilevato un errore. Il documento non può diventare più invalido di quello che già è e non può essere scoperto essere valido una volta che è stato determinato che non è valido.

Forse sarebbe utile capire perché desideri farlo?

ad es. se stai provando a formattare un documento per renderlo conforme a uno schema, ci sono strumenti che dovrebbero generare per te un'istanza del documento di esempio da uno schema dato, per fungere da riferimento o da esempio/modello.

2

Questo codice in C# dovrebbe fare proprio questo: analizzerà l'intero XML e lo convaliderà con l'XSD fornito, e sputerà fuori tutti gli errori di convalida (o anche gli errori nello schema!) Mentre accadono. Spero che questo ti aiuti!

Il modo in cui lo si utilizza sarebbe:

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

Questo è tutto quello che c'è!

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

Ho provato una soluzione molto simile alla tua un paio di mesi fa: anche questa si interrompe molto prima di quanto piaccia a Jim. –

+0

Mi conosci troppo bene Jeroen. –

1

ho scoperto che OxygenXML editor fa un buon lavoro di questo. È un editor commerciale, ma la convalida viene eseguita con lo Xerces engine per eseguire la convalida (con un'opzione per utilizzarne altri). Ho provato Xerces in precedenza e non sono riuscito a farlo riportare il primo errore, ma dicono che forza per continuare a riportare. Fa davvero un bel lavoro.

XMLSpy ufficialmente non supporta. Sulla base di ciò che ho visto dei due editor, mi piace OxygenXML molto meglio di XMLSpy, non solo per quella caratteristica (il che è davvero bello come funziona).

+0

oXygen è un ottimo strumento. Non so come abbiamo fatto XSD senza di esso. Inoltre genera documentazione dello schema di qualità. – Gerard