Pregunta

Tengo un archivo XML que se sube a una página ASP.Net a través del control normal de carga de archivos. Cuando se levanta, que estoy tratando de validar y deserializar el XML. Sin embargo, el código de abajo es realmente muy útil para validar un archivo XML que hace referencia a que es XSD como esto:

xsi:schemaLocation="someurl ..\localSchemaPath.xsd"

Sin embargo, si subo este archivo XML, sólo el archivo XML se ha subido, por lo .. \ localSchemaPath.xsd no existe, por lo que no puede validar.

Aunque Almacené el XSD a nivel local, todavía no sería del todo bien que el archivo XML se puede escribir con una ubicación de esquema como:

xsi:schemaLocation="someurl ..\localSchemaPath.xsd"

o     xsi: schemaLocation = "someurl localSchemaPath.xsd" o     xsi: schemaLocation = "someurl .................. \ localSchemaPath.xsd" si así lo desea.

El dilema!

(Para los fines de esta pregunta, me han aplastado debajo del código de: Validación de una XML contra XSD referencia en C # )

using System.Xml;
using System.Xml.Schema;
using System.IO;

public class ValidXSD
{
    public static void Main()
    {
        // Set the validation settings.
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
        settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);

        // Create the XmlReader object.
        XmlReader reader = XmlReader.Create("inlineSchema.xml", settings);

        // Parse the file. 
        while (reader.Read()) ;
    }

    // Display any warnings or errors.
    private static void ValidationCallBack(object sender, ValidationEventArgs args)
    {
        if (args.Severity == XmlSeverityType.Warning)
            Console.WriteLine("\tWarning: Matching schema not found.  No validation occurred." + args.Message);
        else
            Console.WriteLine("\tValidation error: " + args.Message);
    }
}
¿Fue útil?

Solución

Aquí es un trozo de código que utilizo para validar XML con un esquema local:

string errors = string.Empty;

try
{
    XmlSchemaSet schemas = new XmlSchemaSet();
    schemas.Add(string.Empty, Page.MapPath("~/xml/Schema.xsd"));
    XmlDocument doc = new XmlDocument();
    doc.Schemas = schemas;
    doc.Load(Page.MapPath("~/xml/sampleXML.xml"));
    //use this line instead of the one above for a string in memory.
    //doc.InnerXml = xmlToValidate;  
    ValidationEventHandler validator = delegate(object send, ValidationEventArgs ve)
                                           {
                                               errors += "\n" + ve.Severity + ": " + ve.Message;
                                           };

    doc.Validate(validator);
}
catch (XmlException xe)
{
    errors += "\n" + xe.Message;
}
catch (XmlSchemaValidationException xe)
{
    errors += "\n" + xe.Message;
}

Otros consejos

Yo no puedo distinguir si está intentando validar una contra-cualquier-esquema-referencia genérica, o si tiene un esquema específico que valide contra cada vez, y simplemente no está seguro de cómo manejar las referencias .

Si es esto último, entonces hacer público el esquema en el Internet, y decirle a la gente a hacer referencia a ella por el URI.

Si es lo primero, entonces yo sugeriría lo siguiente:

  • En primer lugar el usuario carga un archivo XML.
  • analizar el archivo XML para una referencia de esquema. Diles que "se encontraron referencias a yourSchema.xsd; por favor, cargue este archivo más adelante". Con una nueva caja de carga
  • A continuación, validar el archivo con el esquema subido. Para ello, modifique la propiedad Schemas de su objeto settings, en lugar de modificar la propiedad ValidationFlags.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top