تحميل ملف XML ، الرجوع XSD ، ASP.Net
-
20-09-2019 - |
سؤال
لدي ملف 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
مكان الإقامة.