ЭлементDOM.Префикс

Свойства · Prefix

Тип: Строка. Префикс узла DOM. Свойство имеет значение Неопределено для узлов, отличных Атрибут и Элемент, или для узлов, созданных при помощи метода DOM Level 1 (например, СоздатьЭлемент).

Полное описание, параметры и ограничения

ЭлементDOM.Префикс (DOMElement.Prefix)

ЭлементDOM (DOMElement)

Префикс (Prefix)

Доступен, начиная с версии 8.1.

Использование:
Чтение и запись.
Описание:
Тип: Строка.
Префикс узла DOM.
Свойство имеет значение Неопределено для узлов, отличных Атрибут и Элемент, или для узлов, созданных при помощи метода DOM Level 1 (например, СоздатьЭлемент).
Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

Использование в версии:

Доступен, начиная с версии 8.1.

Методическая информация

Практические примеры

Переименовать XML-товар и атрибут с сохранением нового узла

После переименования может вернуться прежний или новый объект. Поэтому продолжаем работу только с возвращённым узлом и проверяем его актуальные имя и URI.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.

  2. Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.

  3. Преобразования выполняются только над собственным XML в памяти. Примеры не читают файлы, внешние DTD, URL или данные информационной базы.

  4. У методов DOM возвращаемый узел сохраняйте в переменную: исходная ссылка и результат операции не всегда обозначают один объект.

URI = "urn:guide:products";
Документ = Новый ДокументDOM(URI, "g:products");
Корень = Документ.ЭлементДокумента;
Корень.УстановитьСоответствиеПространстваИмен("g", URI);
Товар = Документ.СоздатьЭлемент(URI, "g:product");
Атрибут = Документ.СоздатьАтрибут("code");
Атрибут.Значение = "A-01";
Товар.УстановитьУзелАтрибута(Атрибут);
Товар.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("Книга"));
Корень.ДобавитьДочерний(Товар);
Товар = Документ.ПереименоватьУзел(Товар, URI, "g:item");
Сообщить(Товар.ЛокальноеИмя = "item");
Сообщить(Товар.Префикс = "g");
Сообщить(Товар.URIПространстваИмен = URI);
Сообщить(Товар.РодительскийУзел = Корень);
Сообщить(Товар.ТекстовоеСодержимое = "Книга");
Атрибут = Товар.ПолучитьУзелАтрибута("code");
Атрибут = Документ.ПереименоватьУзел(Атрибут, "", "sku");
Сообщить(Атрибут.Имя = "sku");
Сообщить(Атрибут.Значение = "A-01");
Сообщить(Товар.ПолучитьАтрибут("code") = Неопределено);
Сообщить(Товар.ПолучитьАтрибут("sku") = "A-01");
Сообщить(Корень.ПервыйДочерний.УзелИдентичен(Товар));

Разбор по шагам

  1. Создаём namespace-aware product и обычный атрибут code; оба принадлежат собственному документу.

  2. ПереименоватьУзел возвращает результат, который сразу присваиваем Товар. Имя становится g:item, URI не меняется, содержимое Книга сохраняется.

  3. Заново получаем атрибут актуального элемента и переименовываем code в sku. Атрибут также сохраняем из результата операции.

  4. Проверяем, что code исчез из актуального элемента, sku содержит A-01 и корень ссылается именно на актуальный Товар.

Как проверить результат

  1. Все десять логических сообщений дают Истина.

  2. Получена структура products/item с атрибутом sku=A-01 и текстом Книга.

Ожидаемый результат

Показан корректный шаблон переименования без предположения о сохранении идентичности исходного узла.

На что обратить внимание

  1. Метод предназначен только для ЭлементDOM и АтрибутDOM. Для текста или комментария он вызывает исключение.

  2. Узел должен принадлежать документу, вызывающему метод. Переименование не является импортом из другого документа.

  3. Не сохраняйте старую ссылку на атрибут до переименования элемента как единственный источник истины: реализация может заменить элемент новым узлом.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Сравнить восемь видов узлов XML на одном созданном дереве

Получаем настоящие документ, элемент, атрибут, текст, комментарий, CDATA, инструкцию и фрагмент. Таблица объясняет, почему одни свойства имеют значение, а другие — Неопределено.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Выполняйте на сервере учебной базы; документ и все восемь узлов полностью создаются в памяти.

  2. Фрагмент намеренно не вставляется в основной документ: это отдельный контейнер с элементом note.

  3. Поставьте точку останова после цикла и откройте Диагностика в отладчике, чтобы сравнить все шестнадцать колонок.

Документ = Новый ДокументDOM("urn:guide:nodes", "g:guide");
Корень = Документ.ЭлементДокумента;
Корень.УстановитьСоответствиеПространстваИмен("g", "urn:guide:nodes");
Атрибут = Документ.СоздатьАтрибут("code");
Атрибут.Значение = "A-01";
Корень.УстановитьУзелАтрибута(Атрибут);
Текст = Документ.СоздатьТекстовыйУзел("Книга");
Комментарий = Документ.СоздатьКомментарий("учебный комментарий");
CDATA = Документ.СоздатьСекциюCDATA("<данные>");
Инструкция = Документ.СоздатьИнструкциюОбработки("guide", "mode=test");
Корень.ДобавитьДочерний(Текст);
Корень.ДобавитьДочерний(Комментарий);
Корень.ДобавитьДочерний(CDATA);
Корень.ДобавитьДочерний(Инструкция);
Фрагмент = Документ.СоздатьФрагментДокумента();
Фрагмент.ДобавитьДочерний(Документ.СоздатьЭлемент("note"));
Узлы = Новый Массив;
Узлы.Добавить(Документ);
Узлы.Добавить(Корень);
Узлы.Добавить(Атрибут);
Узлы.Добавить(Текст);
Узлы.Добавить(Комментарий);
Узлы.Добавить(CDATA);
Узлы.Добавить(Инструкция);
Узлы.Добавить(Фрагмент);

Диагностика = Новый ТаблицаЗначений;
Для Каждого ИмяКолонки Из СтрРазделить("Тип,Имя,ЛокальноеИмя,URI,Префикс,Значение,Текст,БазовыйURI,ДокументВладелец,Родитель,Предыдущий,Следующий,Первый,Последний,Детей,Атрибутов", ",") Цикл
    Диагностика.Колонки.Добавить(ИмяКолонки);
КонецЦикла;
Для Каждого Узел Из Узлы Цикл
    СтрокаДиагностики = Диагностика.Добавить();
    СтрокаДиагностики.Тип = Узел.ТипУзла;
    СтрокаДиагностики.Имя = Узел.ИмяУзла;
    СтрокаДиагностики.ЛокальноеИмя = Узел.ЛокальноеИмя;
    СтрокаДиагностики.URI = Узел.URIПространстваИмен;
    СтрокаДиагностики.Префикс = Узел.Префикс;
    СтрокаДиагностики.Значение = Узел.ЗначениеУзла;
    СтрокаДиагностики.Текст = Узел.ТекстовоеСодержимое;
    СтрокаДиагностики.БазовыйURI = Узел.БазовыйURI;
    СтрокаДиагностики.ДокументВладелец = Узел.ДокументВладелец;
    СтрокаДиагностики.Родитель = Узел.РодительскийУзел;
    СтрокаДиагностики.Предыдущий = Узел.ПредыдущийСоседний;
    СтрокаДиагностики.Следующий = Узел.СледующийСоседний;
    СтрокаДиагностики.Первый = Узел.ПервыйДочерний;
    СтрокаДиагностики.Последний = Узел.ПоследнийДочерний;
    СтрокаДиагностики.Детей = Узел.ДочерниеУзлы.Количество();
    Если Узел.Атрибуты = Неопределено Тогда
        СтрокаДиагностики.Атрибутов = 0;
    Иначе
        СтрокаДиагностики.Атрибутов = Узел.Атрибуты.Количество();
    КонецЕсли;
    Сообщить(СтрШаблон("%1 / %2: детей %3, атрибутов %4", Узел.ТипУзла, Узел.ИмяУзла,
        СтрокаДиагностики.Детей, СтрокаДиагностики.Атрибутов));
    Сообщить(Узел.ЕстьДочерниеУзлы() = (СтрокаДиагностики.Детей > 0));
    Сообщить(Узел.ЕстьАтрибуты() = (СтрокаДиагностики.Атрибутов > 0));
КонецЦикла;
Сообщить(Диагностика.Количество() = 8);
Сообщить(Документ.ДокументВладелец = Неопределено);
Сообщить(Атрибут.РодительскийУзел = Неопределено);
Сообщить(Атрибут.ЭлементВладелец.УзелИдентичен(Корень));
Сообщить(Текст.ЗначениеУзла = "Книга");
Сообщить(Корень.ЗначениеУзла = Неопределено);
Сообщить(Корень.ТекстовоеСодержимое = "Книга<данные>");
Сообщить(Комментарий.ТекстовоеСодержимое = "учебный комментарий");
Сообщить(Фрагмент.РодительскийУзел = Неопределено);

Разбор по шагам

  1. Свойства общего узла доступны у разных конкретных видов, но их значения отличаются: ИмяУзла #text — не имя товара.

  2. ЗначениеУзла содержит значение текста и атрибута, но не текст элемента. ТекстовоеСодержимое элемента объединяет текст и CDATA, исключая комментарии и инструкции.

  3. РодительскийУзел и ДокументВладелец — разные связи. У атрибута нет родителя дерева, но есть ЭлементВладелец; у документа нет документа-владельца.

  4. Первый/ПоследнийДочерний и соседние узлы могут быть Неопределено. ДочерниеУзлы всё равно предоставляет список, в том числе пустой.

  5. Атрибуты предоставляет коллекцию только у элемента. Проверяем Неопределено до вызова Количество.

  6. URIПространстваИмен, ЛокальноеИмя и Префикс описывают квалифицированное имя; БазовыйURI относится к разрешению URI, а не к адресу товара.

Как проверить результат

  1. Диагностика содержит восемь строк разных видов; проверки наличия детей и атрибутов совпадают с размерами коллекций.

  2. У корня четыре дочерних узла, а ТекстовоеСодержимое равно Книга<данные>, без комментария и mode=test.

  3. Атрибут A-01 не является дочерним узлом корня; его ЭлементВладелец совпадает с корнем.

  4. Фрагмент имеет одного ребёнка note, но пока не имеет родителя в основном дереве.

Ожидаемый результат

Построена диагностическая таблица реальных узлов, которая разделяет имя, значение, текст, связи и пространства имён.

На что обратить внимание

  1. ТекстовоеСодержимое — не сериализованный XML; для разметки используйте ЗаписьDOM.

  2. Значение Неопределено не означает повреждение: для некоторых видов узлов это предусмотренное поведение.

  3. Коллекция атрибутов не обязана сохранять порядок. XML-префикс — псевдоним URI, а не идентификатор бизнес-объекта.

  4. Нельзя произвольно назначать родителя или владельца: эти связи управляются методами дерева.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.