У меня есть файл 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);
}
}