Переименовать 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. Не сохраняйте старую ссылку на атрибут до переименования элемента как единственный источник истины: реализация может заменить элемент новым узлом.

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

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

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

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

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