Получение информации о схеме при проверке XDocument

Это похоже на этот вопрос C # Получить информацию о схеме при проверке xml

Однако я работаю с XDocument для целей LINQ.

Я читаю / разбираю набор файлов CSV и конвертирую в XML, а затем проверяю XML на соответствие схеме XSD.

Я хотел бы зафиксировать конкретные ошибки, связанные со значениями элементов, создать более удобное сообщение и вернуть их пользователю, чтобы можно было исправить входные данные. Один из элементов, который я хотел бы включить в выходные данные, - это некоторая информация о схеме (например, диапазон допустимых значений для числового типа).

В моем текущем подходе (который я готов изменить) я могу фиксировать все, что мне нужно, кроме информации о схеме.

Я пытался получить доступ к SourceSchemaObject в аргументе ValidationEventArgs обработчика события Validation, но он всегда имеет значение null. Я также пробовал GetSchemaInfo XElement, и он тоже оказался нулевым.

Я использую RegEx для определения конкретных ошибок проверки, которые я хочу зафиксировать, и получаю данные из XElement через аргумент отправителя обработчика событий проверки.Я думал преобразовать схему в XDocument и получить то, что мне нужно, через LINQ, но мне кажется, что должен быть лучший вариант

Вот мой текущий метод проверки:

private List this.validationWarnings;
private XDocument xDoc;
private XmlSchemaSet schemas = new XmlSchemaSet();

public List Validate()
{
    this.validationWarnings = new List();

    // the schema is read elsewhere and added to the schema set
    this.xDoc.Validate(this.schemas, new ValidationEventHandler(ValidationCallBack), true);

    return validationWarnings
}

И вот мой метод обратного вызова:

private void ValidationCallBack(object sender, ValidationEventArgs args)
{           
    var element = sender as XElement;

    if (element != null)
    {

        // this is a just a placeholder method where I will be able to extract the 
        //  schema information and put together a user friendly message for specific 
        //  validation errors    
        var message = FieldValidationMessage(element, args);

        // if message is null, then the error is not one one I wish to capture for 
        //  the user and is related to an invalid XML structure (such as missing 
        //  elements or incorrect order).  Therefore throw an exception
        if (message == null)
            throw new InvalidXmlFileStructureException(args.Message, args.Exception);
        else
            validationWarnings.Add(message);

    }
}

Строка var message = FieldValidationMessage (element, args); в моем методе обратного вызова является просто заполнителем и еще не существует. Цель этого метода - сделать 3 вещи:

  1. Определить конкретную проверку ошибок при использовании RegEx в args.Message (это уже работает, я протестировал шаблоны, которые планирую использовать)

  2. Получите значения атрибутов из XDocument, связанные с конкретным XElement, вызывающим ошибку (например, как номер строки и столбца в исходном CSV)

  3. Захватите информацию о схеме, если она доступна, чтобы в выходное сообщение можно было добавить типы полей и ограничения.

6
задан Community 23 May 2017 в 11:55
поделиться