C # Получить информацию о схеме при проверке XML - PullRequest
0 голосов
/ 19 сентября 2011

Я пытаюсь проверить некоторый XML по схеме и собрать как можно больше информации, чтобы предоставить пользователю ценные сообщения об ошибках.

Мне удалось проверить сериализованный объект по XSD.Мой ValidationEventHandler вызывается правильно для всех ошибок, и я получаю некоторую информацию там.Единственная проблема заключается в том, что информация о схеме на данный момент недоступна - я пытаюсь добраться до типа схемы элемента.то есть, учитывая следующий элемент схемы, я хотел бы получить "BookType"

<element minOccurs="0" maxOccurs="1" name="TypeOfBook" type="myTypes:BookType" />

Я считаю, что информация о схеме / проверке вставляется в XML во время процесса проверки.Поэтому, если я вызываю validate два раза подряд, только обрабатывая ошибки во второй раз, информация о схеме доступна.

serializedObject.Validate((x, y) => { });
serializedObject.Validate((x, y) => { // handle errors here because elements will have schema info available });

Очевидно, что это решение оставляет желать лучшего.Каков рекомендуемый способ борьбы с этим?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2011

Я нашел решение.

Каждый раз, когда вызывается ValidationEventHandler, добавляйте Xmlelement XmlSchemaValidationException.SourceObject в список. После завершения проверки информация схемы будет добавлена ​​к этим объектам, что позволит мне получить доступ к информации. т.е. Element.SchemaInfo.SchemaType.Name.

Исключение XmlSchemaValidationException передается в обработчик событий со свойством «SourceObject», которое является элементом XmlElement.

            List<XmlElement> errorElements = new List<XmlElement>();

            serializedObject.Validate((x, y) =>
            {
                var exception = (y.Exception as XmlSchemaValidationException);

                if (exception != null)
                {
                    var element = (exception.SourceObject as XmlElement);

                    if (element != null)
                        errorElements.Add(new XmlValidationError(element));
                }

            });
0 голосов
/ 19 сентября 2011

XmlNode.SchemaInfo похоже, что она предоставит эту информацию.

Я предполагаю, что она будет заполнена, когда XmlDocument загружается с использованием XmlReader, созданным для проверки XSD.

Однако при выполнении валидации обработчик ошибок валидации (XmlReaderSettings.ValidationEventHandler) имеется только ограниченная информация, доступная в экземплярах XmlSchemaException, переданных с ValidationEventArgs).В частности, во входном документе нет XmlNode или аналогичной ссылки.Однако есть ссылка на SourceSchemaObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...