Il caricamento di un file XML, fa riferimento a un XSD, in ASP.Net
-
20-09-2019 - |
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);
}
}
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 oggettosettings
, invece di modificare la proprietàValidationFlags
.