Domanda

Ho un file XML che viene caricato a una pagina ASP.Net tramite il normale controllo di caricamento di file. Quando si alza, sto cercando di convalidare e deserializzare l'XML. Tuttavia, il codice qui sotto è davvero molto utile per la convalida di un file XML che fa riferimento è XSD in questo modo:

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

Tuttavia, se caricare il file XML, solo il file XML viene caricato, così .. \ localSchemaPath.xsd non esiste, quindi non può convalidare.

Anche se ho conservato il XSD a livello locale, ancora non sarebbe giusto come il file XML potrebbe essere scritto con una posizione dello schema del tipo:

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

o     xsi: schemaLocation = "someurl localSchemaPath.xsd" o     xsi: schemaLocation = "someurl .................. \ localSchemaPath.xsd" se lo desidera.

Dilemma!

(Ai fini di questa domanda, mi hanno pizzicato il codice qui sotto da: Convalida di un XML contro XSD si fa riferimento in 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);
    }
}
È stato utile?

Soluzione

Ecco un pezzo di codice che uso per convalidare XML con uno schema locale:

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;
}

Altri suggerimenti

Non riesco a capire se si sta tentando un generico validate-contro-qualsiasi-referenziato-schema, o se si dispone di uno schema specifico che si convalidano contro ogni volta, e non sono solo sicuro di come gestire i riferimenti .

Se è quest'ultimo, poi fare il pubblico dello schema su internet, e dire alla gente di fare riferimento a esso da URI.

Se è la prima, poi vorrei suggerire quanto segue:

  • In primo luogo l'utente carica un file XML.
  • analizzare il file XML per un riferimento schema. Dite loro "I riferimenti alla yourSchema.xsd sono stati trovati, si prega di caricare il file sotto". con una nuova casella di caricamento
  • Quindi, convalidare il file rispetto allo schema caricato. Per fare questo, modificare la proprietà Schemas del vostro oggetto settings, invece di modificare la proprietà ValidationFlags.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top