powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / После добавления атрибута для одной ноды отваливается схема для всего XML-файла
9 сообщений из 9, страница 1 из 1
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
    #38255668
Leone1930
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не уверен, сюда ли спрашиваю, но всё таки:

Проблема такая. Я через C# код открываю XML-файл и накладываю схему:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
try
            {
                XmlSchema schema = new XmlSchema();
                schema.SourceUri = "TestValidation.xsd";
                XmlReaderSettings settings = new XmlReaderSettings();

                settings.ValidationType = ValidationType.Schema;
                settings.ValidationFlags |= XmlSchemaValidationFlags.AllowXmlAttributes;
                settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
                settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
                settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;

                settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessIdentityConstraints;
                settings.ValidationEventHandler += ValidationCallBack;
                settings.Schemas.Add(schema);
                settings.Schemas.Compile();

                using (XmlReader reader = XmlReader.Create("TestValidation.xml", settings))
                {
                    testXml.Load(reader);
                }
                if (testXml.SchemaInfo.Validity != XmlSchemaValidity.Valid) throw new ApplicationException("The XML schema isn't valid.");
            }
            catch
            ...


На данном этапе XML-документ полностью валидный.

После этого добавляю ноде новый валидный атрибут:
Код: c#
1.
2.
XmlAttribute attribute = node.OwnerDocument.CreateAttribute("Attr2");
node.Attributes.InsertAfter(attribute, null);



И пытаюсь завалидировать измененную ноду:
Код: c#
1.
node.OwnerDocument.Validate(ValidationCallBack, node);



Но при запросе:
Код: c#
1.
node.SchemaInfo.Validity


Любая нода возвращает
Код: c#
1.
NotKnown



То есть XML-документ потерял валидацию по схеме.

Помогает только полная валидация всего XML-документа:
Код: c#
1.
node.OwnerDocument.Validate(ValidationCallBack);



После этого всё валидно, в том числе и добавленный атрибут.
Но XML-документ большой и валидировать каждый раз целиком не вариант. Возможно ли валидировать только измененную ноду и чтобы при этом схема не отваливалась от нетронутых нод?
...
Рейтинг: 0 / 0
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
    #38260632
Leone1930
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант второй. Пускай схема отваливается, но хотелось бы валидировать выбранную ноду. Кто-нибудь знает, как это сделать?
...
Рейтинг: 0 / 0
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
    #38260679
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нельзя валидировать ноду в вакууме. Согласно схеме, она должна быть в строго определенном месте, а как узнать, правильное ли у нее место без валидации всего документа?

Если производится всего одно действие, зачем его валидировать? Ты же хардкодишь его своими руками, тем самым гарантируя валидность.

Если действий много, почему нельзя валидировать весь документ один раз после обработки?
...
Рейтинг: 0 / 0
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
    #38260722
Leone1930
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,
Необходимо получать валидную ноду после её изменения/добавления

Просто я тогда не понимаю, зачем перегрузка этого метода с указанием ноды для валидации:
Код: c#
1.
node.OwnerDocument.Validate(ValidationCallBack, node);
...
Рейтинг: 0 / 0
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
    #38260762
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leone1930Antonariy,
Необходимо получать валидную ноду после её изменения/добавленияТы получаешь ноду, валидированную самописным программным кодом, который ты писал с оглядкой на схему. Зачем ее дополнительно валидировать схемой?

Leone1930Просто я тогда не понимаю, зачем перегрузка этого метода с указанием ноды для валидации:
Код: c#
1.
node.OwnerDocument.Validate(ValidationCallBack, node);

Действительно, вопрос. Видимо, проверяется все же не весь документ, а лишь путь от ноды до рута.
...
Рейтинг: 0 / 0
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
    #38288955
Leone1930
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

можно.
...
Рейтинг: 0 / 0
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
    #38288956
Leone1930
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyНельзя валидировать ноду в вакууме.
Можно.
...
Рейтинг: 0 / 0
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
    #38290428
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
    #38290563
Leone1930
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest12345Leone1930,
Вообще этот нюанс в документации описан:

Specifically, if the child elements or attributes of an element are inserted, updated, or deleted, then the validity of the element becomes unknown. This is represented by the Validity property of the element's SchemaInfo property being set to NotKnown. Furthermore, this effect cascades upwards recursively across the XML document, because the validity of the element's parent element (and its parent element, and so on) also becomes unknown.


Ньюанс я этот тоже видел. И в документации и на практике.
Но вот если взять непровереный XML-документ и схему для него. Потом, не проверяя весь документ и ничего не записывая в него, сделать валидацию любой приглянувшейся ноды методом
Код: c#
1.
node.OwnerDocument.Validate(ValidationCallBack, node);

, то нода "node" вернет "Valid", либо "Invalid". А все остальные, даже дочерние будут в статусе "NotKnown".
Так что валидировать одну ноду можно.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / После добавления атрибута для одной ноды отваливается схема для всего XML-файла
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]