2009-11-01 26 views
5

Non voglio fare niente di fantasia, voglio solo assicurarmi che un documento sia valido, e stampare un messaggio di errore se non lo è. Google mi ha indirizzato a this, ma sembra che XmlValidatingReader sia obsoleto (almeno, questo è ciò che mi dice MonoDevelop).Come convalidare un documento XML contro un DTD in C#?

Modifica: sto provando il suggerimento di Mehrdad, ma sto avendo problemi. Penso di averne la maggior parte, ma non riesco a trovare OnValidationEvent da nessuna parte. Da dove provengo OnValidationEvent?

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ValidationType = ValidationType.DTD; 
settings.ValidationEventHandler += new ValidationEventHandler(/*trouble is here*/); 
XmlReader validatingReader = XmlReader.Create(fileToLoad, settings); 
+0

A proposito, cosa si intende per "conversione in C#". Il mio codice * è * in C# 3.0. –

+0

@Mehrdad: Scusa, l'ho scritto mentre stavo ancora imparando C# 1.0, e non sapevo che 'var' era valido in C#. –

risposta

4

Anziché creare XmlValidatingReader class direttamente, è necessario costruire un adeguato XmlReaderSettings object e passarlo come argomento al XmlReader.Create method:

var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD }; 
settings.ValidationEventHandler += new ValidationEventHandler(OnValidationEvent); 
var reader = XmlReader.Create("file.xml", settings); 

Il resto è invariato.

P.S. OnValidationEvent è il nome del metodo che si dichiara di gestire gli eventi di convalida. Ovviamente, è possibile rimuovere la linea se non si desidera sottoscrivere gli eventi di convalida generati dallo XmlReader.

+0

Da dove si ottiene OnValidationEvent? Vedi la mia modifica. –

+0

Matthew: Questo è il metodo che dichiareresti per gestire gli eventi di convalida falliti. È possibile rimuovere la riga del tutto se si desidera che genera eccezione. –

2
var messages = new StringBuilder(); 
var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD }; 
settings.ValidationEventHandler += (sender, args) => messages.AppendLine(args.Message); 
var reader = XmlReader.Create("file.xml", settings); 

if (messages.Length > 0) 
{ 
    // Log Validation Errors 
    // Throw Exception 
    // Etc. 
} 

ValidationEventHandler

Lambda Expressions

Type Inference

+0

Ehm, Mehrdad non ha dato essenzialmente la stessa risposta, 22 minuti prima di te? –

+0

Questa risposta è un modo diverso di realizzare la stessa cosa. – ChaosPandion

-1

descrizione completa:

  1. In Visual Studio .NET, creare un nuovo Visual progetto C# applicazione console denominato ValidateXml. Aggiungere due istruzioni using all'inizio di Class1.cs come segue:

    using System.Xml;  // for XmlTextReader and XmlValidatingReader 
    using System.Xml.Schema; // for XmlSchemaCollection (which is used later) 
    
  2. In Class1.cs, dichiarare una variabile booleana denominata isValid prima della dell'inizio del metodo Main come segue:

    private static bool isValid = true;  // If a validation error occurs, 
                 // set this flag to false in the 
                 // validation event handler. 
    
  3. Creare un oggetto XmlTextReader per leggere un documento XML da un file di testo nel metodo Main e quindi creare uno XmlValidatingReader a convalidare i dati questo XML come segue:

    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithDTD.xml"); 
    XmlValidatingReader v = new XmlValidatingReader(r); 
    
  4. La ValidationType proprietà del XmlValidatingReader oggetto indica il tipo di convalida che è necessario (DTD, XDR o Schema). Impostare questa proprietà DTD come segue:

    v.ValidationType = ValidationType.DTD; 
    
  5. Se si verificano errori di convalida, il lettore la convalida genera un evento convalida.Aggiungere il seguente codice per registrare un gestore di eventi di convalida (si implementare il metodo MyValidationEventHandler al punto 7):

    v.ValidationEventHandler += 
        new ValidationEventHandler(MyValidationEventHandler); 
    
  6. Aggiungere il seguente codice per leggere e convalidare il documento XML. Se si verificano errori di convalida , MyValidationEventHandler viene richiamato all'indirizzo per correggere l'errore. Questo metodo imposta isValid su false (vedere il passaggio 8). È possibile verificare lo stato di isValid dopo la convalida per verificare se il documento è valido o non valido.

    while (v.Read()) 
    { 
        // Can add code here to process the content. 
    } 
    v.Close(); 
    
    // Check whether the document is valid or invalid. 
    if (isValid) 
        Console.WriteLine("Document is valid"); 
    else 
        Console.WriteLine("Document is invalid"); 
    
  7. Scrivi il metodo MyValidationEventHandler dopo il metodo Main come segue:

    public static void MyValidationEventHandler(object sender, 
                  ValidationEventArgs args) 
    { 
        isValid = false; 
        Console.WriteLine("Validation event\n" + args.Message); 
    } 
    

Compilare ed eseguire l'applicazione. L'applicazione dovrebbe segnalare che il documento XML è valido. ad esempio In Visual Studio .NET, modificare ProductWithDTD.xml per invalidarlo (ad esempio, eliminare l'elemento <AuthorName>M soliman</AuthorName>). Eseguire nuovamente l'applicazione. Si visualizza il seguente messaggio di errore:

Validation event 
Element 'Product' has invalid content. Expected 'ProductName'. 
An error occurred at file:///C:/MyFolder/ProductWithDTD.xml(4, 5). 
Document is invalid 
+1

Meh - questo è solo un copia/incolla di un campione MSDN, quasi alla lettera. Per lo meno, fornire un riferimento: http://support.microsoft.com/kb/307379 –

Problemi correlati