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);
    }
}
War es hilfreich?

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 Ihres settings Objekt, anstatt die ValidationFlags Eigenschaft zu ändern.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top