سؤال

لدي ملف XML التي يتم تحميلها إلى ASP.Net الصفحة عبر العادي تحميل ملف التحكم.عندما يستيقظ ، أنا أحاول التحقق من صحة تسلسل XML.ومع ذلك ، فإن رمز أدناه هو حقا مفيد جدا من أجل التحقق من صحة ملف XML الذي مراجع انها XSD مثل هذا:

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

ومع ذلك ، إذا كنت تحميل هذا الملف XML, فقط ملف XML يحصل تحميلها لذلك ..\localSchemaPath.xsd لا وجود لها, لذلك لا يمكن التحقق من صحة.

حتى لو تخزين XSD محليا ، فإنه لن يكون على حق تماما مثل ملف XML يمكن أن تكون مكتوبة مع مخطط الموقع مثل:

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

أو xsi:schemaLocation="someurl localSchemaPath.xsd" أو xsi:schemaLocation="someurl ..................\localSchemaPath.xsd" إذا رغبت في ذلك.

المعضلة!

(لأغراض هذا السؤال ، أنا مقروص رمز أدناه من: التحقق من صحة XML ضد المشار إليها XSD في 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);
    }
}
هل كانت مفيدة؟

المحلول

وهنا هو جزء من التعليمات البرمجية التي يمكنني استخدامها لXML التحقق من صحة مع مخطط المحلي:

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

نصائح أخرى

أنا لا يمكن أن تجعل تماما إذا كنت تحاول عام صحة-ضد-أي المرجعية-المخطط ، أو إذا كان لديك محدد المخطط أن التحقق من صحة ضد كل مرة و فقط لم تكن متأكدا من كيفية التعامل مع المراجع.

إذا كان هذا الأخير, ثم جعل المخطط العام على الإنترنت, و أخبر الناس أن مرجع ذلك URI.

إذا كان من السابق, ثم أود أن أقترح ما يلي:

  • أولا المستخدم بتحميل ملف XML.
  • تحليل ملف XML مخطط المرجعية.أقول لهم "المراجع yourSchema.xsd تم العثور ؛ يرجى تحميل هذا الملف أدناه" مع جديد تحميل مربع.
  • ثم التحقق من صحة ملف ضد تحميلها المخطط.للقيام بذلك, تعديل Schemas مكان الإقامة settings كائن بدلا من تعديل ValidationFlags مكان الإقامة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top