2009-11-01 20 views
5

No quiero hacer nada elegante, solo quiero asegurarme de que un documento sea válido e imprimir un mensaje de error si no es así. Google me indicó this, pero parece que XmlValidatingReader está obsoleto (al menos, eso es lo que MonoDevelop me dice).¿Cómo valido un documento XML contra una DTD en C#?

Editar: Estoy probando la sugerencia de Mehrdad, pero estoy teniendo problemas. Creo que tengo la mayor parte, pero no puedo encontrar OnValidationEvent en ninguna parte. ¿De dónde voy obtengo OnValidationEvent?

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

Por cierto, ¿qué quiere decir con "convertir a C#". Mi código * está * en C# 3.0. –

+0

@Mehrdad: Lo siento, escribí que mientras todavía estaba aprendiendo C# 1.0, y no sabía que 'var' era válido en C#. –

Respuesta

4

En lugar de crear XmlValidatingReader class directamente, usted debe construir una adecuada XmlReaderSettings object y lo pasa como argumento a la XmlReader.Create method:

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

El resto permanece sin cambios.

P.S. OnValidationEvent es el nombre del método que declara para manejar eventos de validación. Obviamente, puede eliminar la línea si no desea suscribirse a los eventos de validación planteados por el XmlReader.

+0

¿De dónde obtienes OnValidationEvent? Ver mi edición –

+0

Matthew: Ese es el método que declararía para manejar eventos de validación fallidos. Puede eliminar esa línea por completo si desea lanzar una excepción en su lugar. –

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

Um, ¿acaso Mehrdad no dio esencialmente la misma respuesta, 22 minutos antes que tú? –

+0

Esta respuesta es una forma diferente de lograr lo mismo. – ChaosPandion

-1

descripción completa:

  1. En Visual Studio .NET, cree un nuevo proyecto de Visual C# aplicación de consola de nombrado ValidateXml. Agregue dos instrucciones using al principio de Class1.cs de la siguiente manera:

    using System.Xml;  // for XmlTextReader and XmlValidatingReader 
    using System.Xml.Schema; // for XmlSchemaCollection (which is used later) 
    
  2. En Class1.cs, declarar una variable booleana llamada isValid antes del inicio del método Main de la siguiente manera:

    private static bool isValid = true;  // If a validation error occurs, 
                 // set this flag to false in the 
                 // validation event handler. 
    
  3. Cree un objeto XmlTextReader para leer un documento XML desde un archivo de texto en el método Main y luego cree un XmlValidatingReader en validar los datos de este XML como sigue:

    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithDTD.xml"); 
    XmlValidatingReader v = new XmlValidatingReader(r); 
    
  4. El ValidationType propiedad de la XmlValidatingReader objeto indica el tipo de validación que se requiere (DTD, XDR, o Esquema). Establecer esta propiedad en DTD de la siguiente manera:

    v.ValidationType = ValidationType.DTD; 
    
  5. Si se produce algún error de validación, el lector de validación genera un evento validación.Agregue el código siguiente para registrar un controlador de eventos de validación (implementará método MyValidationEventHandler en el paso 7):

    v.ValidationEventHandler += 
        new ValidationEventHandler(MyValidationEventHandler); 
    
  6. Agregar el siguiente código para leer y validar el documento XML. Si se produce algún error de validación , se llama al MyValidationEventHandler al para resolver el error. Este método establece isValid en falso (consulte el Paso 8). Puede verificar el estado de isValid después de la validación para ver si el documento es válido o inválido.

    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. Escribir el método MyValidationEventHandler después del método Main como sigue:

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

Construir y ejecutar la aplicación. La aplicación debe informar que el documento XML es válido. e.g .: En Visual Studio .NET, modifique ProductWithDTD.xml para invalidarlo (por ejemplo, elimine el elemento <AuthorName>M soliman</AuthorName>). Ejecute la aplicación nuevamente. Debería recibir el siguiente mensaje de error:

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: esto es solo copiar/pegar de una muestra de MSDN, casi textualmente. Como mínimo, proporcione una referencia: http://support.microsoft.com/kb/307379 –

Cuestiones relacionadas