Проверьте xml с пространствами имен в c# - PullRequest
0 голосов
/ 01 апреля 2020

Мне нужна небольшая помощь для проверки файла xml в c # ... У меня есть следующий код:

    private const string XSDFOLDER = "XMLSchema/0.1";

[...]

public bool validaXML(MemoryStream ms)
{
    XmlReader xmlReader = null;
    try {
        //define the settings while reading the XML file
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.ValidationType = ValidationType.Schema;
        var localPath = Path.Combine(Server.MapPath("."), XSDFOLDER);
        settings.Schemas.Add("http://covid-19.iss.it/XMLSchema/0.1/", Path.Combine(localPath, "covid-19.xsd"));
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
        settings.ValidationEventHandler += new ValidationEventHandler(this.ValidationEventHandle);

        //validate the file with the given settings
        xmlReader = XmlReader.Create(ms, settings);

        //iterate over the XML
        while (xmlReader.Read()) { }
        return true;
    } catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
        return false;
    }
    finally
    {
        if (xmlReader != null)
        {
            xmlReader.Close();
        }
    }
}
private void ValidationEventHandle(object sender, ValidationEventArgs args)
{
    //if were are here, it's becouse something is wrong with our XML
    Debug.WriteLine("\r\n\tValidation error: " + args.Message);
    //lbStatus.Text = "Validation failed. message: " + args.Message;

    if (args.Severity == XmlSeverityType.Warning)
        Debug.WriteLine("\tWarning: Matching schema not found.  No validation occurred." + args.Message);
    else
        Debug.WriteLine("\tValidation error: " + args.Message);

    //throw and exception
    throw new Exception(("Validation failed. message: ") + args.Message);
}

, если в файле xml у меня есть (с пробел между пространством имен и именем xsd в xsi: schemaLocation):

<covid-19 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://covid-19.iss.it/XMLSchema/0.1/ covid-19.xsd" xmlns="http://covid-19.iss.it/XMLSchema/0.1/">

Я получаю недопустимое значение xml с ошибкой: Ошибка проверки: невозможно загрузить схему для пространства имен 'http://covid-19.iss.it/XMLSchema/0.1/ '- Не удалось найти файл' C: \ Program Files (x86) \ IIS Express \ covid-19.xsd '. Предупреждение: соответствующая схема не найдена. Проверка не произошла. Не удалось загрузить схему для пространства имен 'http://covid-19.iss.it/XMLSchema/0.1/' - Не удалось найти файл 'C: \ Program Files (x86) \ IIS Express \ covid-19.xsd'.

в то время как в XML у меня есть:

<covid-19 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://covid-19.iss.it/XMLSchema/0.1/covid-19.xsd" xmlns="http://covid-19.iss.it/XMLSchema/0.1/">

или любая строка в xsi.schemaLocation, например:

<covid-19 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://covid-19.iss.it/XMLSchema/0.1/aaaaaaaaaaa.xsd" xmlns="http://covid-19.iss.it/XMLSchema/0.1/">

проверка допустима.

В первом примере xml является правильным и действительным в xmlspy

Я также попытался использовать

settings.Schemas.Add("http://covid-19.iss.it/XMLSchema/0.1/", "http://covid-19.iss.it/XMLSchema/0.1/covid-19.xsd");

и изменить xml следующим образом: (в xmlspy все еще допустимо):

<covid-19 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://covid-19.iss.it/XMLSchema/0.1/ http://covid-19.iss.it/XMLSchema/0.1/covid-19.xsd" xmlns="http://covid-19.iss.it/XMLSchema/0.1/">

, но я получаю сообщение об ошибке: Возникло исключение: 'System. Net .WebException' в System.dll Основное соединение было закрыто: при отправке произошла непредвиденная ошибка.

Не могли бы вы мне помочь? Заранее спасибо.

...