Это похоже на этот вопрос 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 вещи:
Определить конкретную проверку ошибок при использовании RegEx в args.Message
(это уже работает, я протестировал шаблоны, которые планирую использовать)
Получите значения атрибутов из XDocument, связанные с конкретным XElement, вызывающим ошибку (например, как номер строки и столбца в исходном CSV)
Захватите информацию о схеме, если она доступна, чтобы в выходное сообщение можно было добавить типы полей и ограничения.