Тип: АтрибутDOM, ДокументDOM, ЭлементDOM, ОпределениеТипаДокументаDOM, НотацияDOM, СущностьDOM, ФрагментДокументаDOM, ТекстDOM, КомментарийDOM, СекцияCDATADOM, ИнструкцияОбработкиDOM, СсылкаНаСущностьDOM, ПространствоИменXPath, Неопределено. Родительский узел узла DOM или Неопределено в случае отсутствия такового. Все узлы, за исключением Атрибут, Документ, ФрагментДокумента, Сущность и Нотация могут иметь родительский узел. В любом случае если узел только что был создан и еще не добавлен в дерево или был уже удален из него, родительский узел отсутствует.
Полное описание, параметры и ограничения
СущностьDOM.РодительскийУзел (DOMEntity.ParentNode)
СущностьDOM (DOMEntity)
РодительскийУзел (ParentNode)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: АтрибутDOM, ДокументDOM, ЭлементDOM, ОпределениеТипаДокументаDOM, НотацияDOM, СущностьDOM, ФрагментДокументаDOM, ТекстDOM, КомментарийDOM, СекцияCDATADOM, ИнструкцияОбработкиDOM, СсылкаНаСущностьDOM, ПространствоИменXPath, Неопределено.
Родительский узел узла DOM или Неопределено в случае отсутствия такового.
Все узлы, за исключением Атрибут, Документ, ФрагментДокумента, Сущность и Нотация могут иметь родительский узел.
В любом случае если узел только что был создан и еще не добавлен в дерево или был уже удален из него, родительский узел отсутствует.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
Описание изменено в версии 8.3.27.
Методическая информация
Практические примеры
Клонировать объявление и отделить равенство от идентичности
Своя служебная пометка связана с узлом, не с XML-текстом. Копия похожа по структуре, но не является тем же объектом и не наследует пользовательские данные.
Где и как запускать
Полный серверный общий модуль своей учебной базы. Внутренний DTD только известной собственной строки, не вход произвольного API.
Подготовка
Только отдельная учебная база. Создайте серверный общий модуль УчебныеЗадачи с процедурой ВыполнитьПример() Экспорт. Полный модуль каждого урока вставьте целиком, включая уже показанную процедуру.
XML содержит только собственный внутренний DTD. Внешнего подмножества DOCTYPE нет, SYSTEM/PUBLIC в двух объявлениях — учебные URN, не пути и не HTTP-адреса.
guideIcon — неразбираемая сущность NDATA; она объявлена, но не используется как &guideIcon; в тексте. Её ресурс не загружается. Нотация описывает формат, не изображение.
Параметры и построитель создаются заново для этой известной строки. Никогда не переносите разрешение DTD на произвольный XML из интернета или API.
Вызовите УчебныеЗадачи.ВыполнитьПример() из серверной учебной команды. Нет записи базы, файлов или сетевых соединений; поведение DOM 1С ещё требует контрольного запуска в учебной базе.
Процедура ВыполнитьПример() Экспорт
Параметры = Новый ПараметрыЧтенияXML(, , , , , Ложь);
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку("<?xml version=""1.0""?>
|<!DOCTYPE products [
|<!NOTATION guideMark PUBLIC ""guide-marker"" ""urn:guide:marker-format"">
|<!ENTITY guideIcon SYSTEM ""urn:guide:marker-payload"" NDATA guideMark>
|]>
|<products xmlns:g=""urn:guide:dtd""><product>Книга</product></products>", Параметры);
Построитель = Новый ПостроительDOM;
Настройки = Построитель.КонфигурацияDOM;
Если НЕ Настройки.ВозможноУстановитьПараметр("disallow-doctype", Ложь) Тогда
Чтение.Закрыть();
ВызватьИсключение "Построитель не разрешает собственный внутренний DTD";
КонецЕсли;
Настройки.УстановитьПараметр("disallow-doctype", Ложь);
Попытка
Документ = Построитель.Прочитать(Чтение);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
ОписаниеТипа = Документ.ОпределениеТипаДокумента;
Если ОписаниеТипа = Неопределено Тогда
ВызватьИсключение "Включите чтение типа документа, не подменяйте его пустым новым DOCTYPE";
КонецЕсли;
Сущность = ОписаниеТипа.Сущности.ПолучитьИменованныйЭлемент("guideIcon");
Нотация = ОписаниеТипа.Нотации.ПолучитьИменованныйЭлемент("guideMark");
Если ТипЗнч(Сущность) <> Тип("СущностьDOM") ИЛИ ТипЗнч(Нотация) <> Тип("НотацияDOM") Тогда
ВызватьИсключение "Построитель не сохранил ожидаемые собственные объявления DTD";
КонецЕсли;
Узлы = Новый Массив;
Узлы.Добавить(Сущность);
Узлы.Добавить(Нотация);
Для Каждого Узел Из Узлы Цикл
Прежнее = Узел.УстановитьПользовательскиеДанные("guide-task", "Учебная проверка");
Сообщить(Прежнее = Неопределено);
Сообщить(Узел.ПолучитьПользовательскиеДанные("guide-task") = "Учебная проверка");
Копия = Узел.КлонироватьУзел(Истина);
Сообщить(Узел.УзелИдентичен(Узел));
Сообщить(НЕ Узел.УзелИдентичен(Копия));
Сообщить(Узел.УзелРавен(Копия));
Сообщить(Копия.ПолучитьПользовательскиеДанные("guide-task") = Неопределено);
Сообщить(Копия.РодительскийУзел = Неопределено);
Положение = Узел.СравнитьПозициюВДокументе(Копия);
Сообщить("Положение отдельной копии: " + Строка(Положение));
Копия.Нормализовать();
Сообщить(Копия.ДочерниеУзлы.Количество() = 0);
Снятое = Узел.УстановитьПользовательскиеДанные("guide-task", Неопределено);
Сообщить(Снятое = "Учебная проверка");
Сообщить(Узел.ПолучитьПользовательскиеДанные("guide-task") = Неопределено);
КонецЦикла;
КонецПроцедурыРазбор по шагам
УстановитьПользовательскиеДанные возвращает прежнее значение. Первый вызов связывает свою пометку с реально полученным узлом.
КлонироватьУзел(Истина) создаёт отдельный узел. По локальной справке у копии не определены родитель и пользовательские данные.
УзелИдентичен сравнивает идентичность, УзелРавен структуру. Оба сравнения проверяются и не подменяют друг друга.
СравнитьПозициюВДокументе только диагностируется: отдельная копия не имеет гарантированного порядка до/после в дереве.
Нормализовать у листа не создаёт детей или загружает содержимое SYSTEM. В конце собственная пометка снимается передачей Неопределено, прежняя строка проверяется.
Как проверить результат
По десять Истина для каждого узла и диагностическое положение копии.
Копии не помещаются в корень или коллекции DTD, исходные объявления не удаляются.
Ожидаемый результат
Различие структуры, идентичности и служебных данных показано на настоящем объявлении.
На что обратить внимание
Пользовательская пометка — не атрибут XML и не постоянная запись.
Положение отдельной копии не используйте как индекс коллекции объявлений.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Прочитать реальные объявления сущности и нотации из собственного DTD
Сущность NDATA ссылается на нотацию формата. Эти два узла не являются тегами product или ссылкой на рабочую картинку.
Где и как запускать
Полный серверный общий модуль своей учебной базы. Внутренний DTD только известной собственной строки, не вход произвольного API.
Подготовка
Только отдельная учебная база. Создайте серверный общий модуль УчебныеЗадачи с процедурой ВыполнитьПример() Экспорт. Полный модуль каждого урока вставьте целиком, включая уже показанную процедуру.
XML содержит только собственный внутренний DTD. Внешнего подмножества DOCTYPE нет, SYSTEM/PUBLIC в двух объявлениях — учебные URN, не пути и не HTTP-адреса.
guideIcon — неразбираемая сущность NDATA; она объявлена, но не используется как &guideIcon; в тексте. Её ресурс не загружается. Нотация описывает формат, не изображение.
Параметры и построитель создаются заново для этой известной строки. Никогда не переносите разрешение DTD на произвольный XML из интернета или API.
Вызовите УчебныеЗадачи.ВыполнитьПример() из серверной учебной команды. Нет записи базы, файлов или сетевых соединений; поведение DOM 1С ещё требует контрольного запуска в учебной базе.
Процедура ВыполнитьПример() Экспорт
Параметры = Новый ПараметрыЧтенияXML(, , , , , Ложь);
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку("<?xml version=""1.0""?>
|<!DOCTYPE products [
|<!NOTATION guideMark PUBLIC ""guide-marker"" ""urn:guide:marker-format"">
|<!ENTITY guideIcon SYSTEM ""urn:guide:marker-payload"" NDATA guideMark>
|]>
|<products xmlns:g=""urn:guide:dtd""><product>Книга</product></products>", Параметры);
Построитель = Новый ПостроительDOM;
Настройки = Построитель.КонфигурацияDOM;
Если НЕ Настройки.ВозможноУстановитьПараметр("disallow-doctype", Ложь) Тогда
Чтение.Закрыть();
ВызватьИсключение "Построитель не разрешает собственный внутренний DTD";
КонецЕсли;
Настройки.УстановитьПараметр("disallow-doctype", Ложь);
Попытка
Документ = Построитель.Прочитать(Чтение);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
ОписаниеТипа = Документ.ОпределениеТипаДокумента;
Если ОписаниеТипа = Неопределено Тогда
ВызватьИсключение "Включите чтение типа документа, не подменяйте его пустым новым DOCTYPE";
КонецЕсли;
Сущность = ОписаниеТипа.Сущности.ПолучитьИменованныйЭлемент("guideIcon");
Нотация = ОписаниеТипа.Нотации.ПолучитьИменованныйЭлемент("guideMark");
Если ТипЗнч(Сущность) <> Тип("СущностьDOM") ИЛИ ТипЗнч(Нотация) <> Тип("НотацияDOM") Тогда
ВызватьИсключение "Построитель не сохранил ожидаемые собственные объявления DTD";
КонецЕсли;
Узлы = Новый Массив;
Узлы.Добавить(Сущность);
Узлы.Добавить(Нотация);
Сообщить(Сущность.ИмяУзла = "guideIcon");
Сообщить(Сущность.ИмяНотации = "guideMark");
Сообщить(Сущность.СистемныйИдентификатор = "urn:guide:marker-payload");
Сообщить(Нотация.ПубличныйИдентификатор = "guide-marker");
Сообщить(Нотация.СистемныйИдентификатор = "urn:guide:marker-format");
Сообщить("PUBLIC сущности: " + Строка(Сущность.ПубличныйИдентификатор));
Сообщить("Версия внешней сущности: " + Строка(Сущность.ВерсияXML));
Сообщить("Кодировка XML сущности: " + Строка(Сущность.КодировкаXML));
Сообщить("Кодировка источника сущности: " + Строка(Сущность.КодировкаИсточника));
Для Каждого Узел Из Узлы Цикл
Сообщить("Тип узла: " + Строка(Узел.ТипУзла));
Сообщить("Имя: " + Узел.ИмяУзла);
Сообщить("База URI: " + Строка(Узел.БазовыйURI));
Сообщить(Узел.ДокументВладелец = Документ);
Сообщить(Узел.ЗначениеУзла = Неопределено);
Сообщить("Текстовое содержимое: " + Строка(Узел.ТекстовоеСодержимое));
Сообщить("Тип атрибутов: " + Строка(ТипЗнч(Узел.Атрибуты)));
Сообщить(НЕ Узел.ЕстьАтрибуты());
Сообщить(НЕ Узел.ЕстьДочерниеУзлы());
Сообщить(Узел.ДочерниеУзлы.Количество() = 0);
Сообщить(Узел.ПервыйДочерний = Неопределено);
Сообщить(Узел.ПоследнийДочерний = Неопределено);
Сообщить(Узел.ПредыдущийСоседний = Неопределено);
Сообщить(Узел.СледующийСоседний = Неопределено);
Сообщить(Узел.РодительскийУзел = Неопределено);
КонецЦикла;
Сообщить(Документ.ЭлементДокумента.ТекстовоеСодержимое = "Книга");
КонецПроцедурыРазбор по шагам
Шестой аргумент ПараметрыЧтенияXML — ИгнорироватьТипДокумента. Ложь сохраняет DTD; readonly-свойства параметров не присваиваются после создания.
ЧтениеXML закрывается при успехе и при ошибке. Собственный ПостроительDOM допускает ровно этот внутренний DTD; отсутствие объявления останавливает пример.
ПолучитьИменованныйЭлемент ищет именно объявленные имена, а типы проверяются до специальных свойств сущности/нотации.
Сущность содержит SYSTEM ресурса и ИмяНотации. Нотация имеет другой SYSTEM и PUBLIC описания формата. URN не разыменовываются.
Неразбираемая сущность и нотация — листья, не дочерние теги корня. ДокументВладелец не является РодительскимУзлом.
Версия и кодировки внешнего разбираемого ресурса здесь не прочитаны: значения только диагностируются и не выдаются за UTF-8 скачанного файла.
Как проверить результат
Пять первых Истина, затем по десять Истина для каждого из двух узлов и последнее Истина для текста Книга.
Текст product получен из собственного XML; содержимое marker-payload не загружалось.
Ожидаемый результат
Получены настоящие два узла DTD с понятной картой свойств.
На что обратить внимание
Не объявляйте наличие SYSTEM доказательством загрузки ресурса.
Если построитель не сохранил DTD, урок остановится, а не заменит реальные узлы фиктивными структурами.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.