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

Проблема такая. Я через 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
16.05.2013, 16:36
    #38260632
Leone1930
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
Вариант второй. Пускай схема отваливается, но хотелось бы валидировать выбранную ноду. Кто-нибудь знает, как это сделать?
...
Рейтинг: 0 / 0
16.05.2013, 16:52
    #38260679
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
Нельзя валидировать ноду в вакууме. Согласно схеме, она должна быть в строго определенном месте, а как узнать, правильное ли у нее место без валидации всего документа?

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

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

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

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

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

можно.
...
Рейтинг: 0 / 0
06.06.2013, 19:08
    #38288956
Leone1930
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
AntonariyНельзя валидировать ноду в вакууме.
Можно.
...
Рейтинг: 0 / 0
07.06.2013, 15:08
    #38290428
guest12345
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
...
Рейтинг: 0 / 0
07.06.2013, 16:01
    #38290563
Leone1930
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После добавления атрибута для одной ноды отваливается схема для всего XML-файла
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
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / После добавления атрибута для одной ноды отваливается схема для всего XML-файла / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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