Hochladen einer XML-Datei, ein XSD-Referenzierung in ASP.Net
-
20-09-2019 - |
Frage
ich eine XML-Datei, die über das normale Datei-Upload-Steuerelement auf eine ASP.Net Seite hochgeladen wird. Wenn es aufsteht, ich bin versucht, die XML zu validieren und deserialisieren. Allerdings ist der Code unten wirklich sehr praktisch für die Validierung einer XML-Datei, die Verweise es XSD wie folgt ist:
xsi:schemaLocation="someurl ..\localSchemaPath.xsd"
Allerdings, wenn ich diese XML-Datei laden, nur die XML-Datei hochgeladen wird, so .. \ localSchemaPath.xsd nicht vorhanden ist, so kann es nicht überprüfen.
Auch wenn ich die XSD lokal gespeichert, es wäre noch nicht ganz richtig, wie die XML-Datei mit einem Schema Speicherort geschrieben werden könnte wie:
xsi:schemaLocation="someurl ..\localSchemaPath.xsd"
oder xsi: schema = "someurl localSchemaPath.xsd" oder xsi: schema = "someurl .................. \ localSchemaPath.xsd" wenn es so gewünscht.
Dilemma!
(Für die Zwecke dieser Frage habe ich den Code unten eingeklemmt: Validieren eines XML gegen referenzierten XSD 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);
}
}
Lösung
Hier ist ein Stück Code, den ich mit einem lokalen Schema zu überprüfen xml verwenden:
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;
}
Andere Tipps
Ich kann nicht ganz machen, ob Sie eine generisches Validate-gegen-jeden-referenzierte-Schema versuchen, oder wenn Sie ein bestimmtes Schema haben, dass Sie gegen jedes Mal bestätigen, und sind einfach nicht sicher, wie die Verweise zu handhaben .
Falls das letzte ist, dann das Schema der Öffentlichkeit über das Internet machen, und den Leuten sagen, sie von URI referenzieren.
Wenn es den ehemaligen ist, dann würde ich vorschlagen, die folgende:
- Zuerst wird die Börse eine XML-Datei.
- Parse die XML-Datei für ein Schema Referenz. Sagen Sie ihnen, „Verweise auf
yourSchema.xsd
gefunden, bitte laden Sie diese Datei unter“. Mit einem neuen Uploadbox - Dann bestätigen Sie die Datei gegen das uploaded Schema. Um dies zu tun, ändern Sie die
Schemas
Eigenschaft Ihressettings
Objekt, anstatt dieValidationFlags
Eigenschaft zu ändern.