ЭлементDOM.ПолучитьСоответствияПространствИмен

Методы · NamespaceMappings

Получает соответствие URI пространств имен. Ключом соответствия является префикс, значением - URI пространства имен.

Синтаксис

ПолучитьСоответствияПространствИмен()
Полное описание, параметры и ограничения

ЭлементDOM.ПолучитьСоответствияПространствИмен (DOMElement.NamespaceMappings)

ЭлементDOM (DOMElement)

ПолучитьСоответствияПространствИмен (NamespaceMappings)

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

Синтаксис:
ПолучитьСоответствияПространствИмен()
Возвращаемое значение:
Тип: Соответствие.

Описание:

Получает соответствие URI пространств имен.
Ключом соответствия является префикс, значением - URI пространства имен.

Доступность:

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

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

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

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

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

Собрать XML-атрибут из текстовых узлов, найти элемент по ID и убрать своё пространство имён

Один самостоятельный опыт: значение id собирается из собственных текстовых узлов, меняется вставкой и заменой, нормализуется, используется для поиска элемента и восстанавливается после удаления. Временное объявление пространства имён проверяется отдельно.

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

Полный модуль управляемой формы ОпытАтрибутXML85.Форма; клиентская команда и серверная функция без контекста, собственный XML DOM только в памяти.

Подготовка

  1. Создайте новую пустую учебную конфигурацию УчебныеАтрибутыXML85 на платформе8.5.1.1343, управляемое приложение. Не используйте рабочую базу или её копию с прикладными обработчиками.

  2. Обработки → ОпытАтрибутXML85 → Формы → Форма, тип Управляемая. Сделайте её основной формой обработки. Реквизиты документов, справочников и табличных частей не нужны.

  3. В форме добавьте команду ПроверитьАтрибутXML85, создайте действие с тем же именем и перетащите команду на форму. Основной код ниже — полный модуль этой формы, не тело отдельного обработчика.

  4. Клиентский обработчик только вызывает серверную функцию и показывает её строковый итог. DOM создаётся и полностью используется на сервере; объекты DOM не передаются через клиент-серверную границу.

  5. Нажмите F7 и обновите только этот новый стенд. runtimeVerifiedScenarios=0: в ходе подготовки справочника 1С и этот пример не запускались; проведённые проверки статические.

  6. После собственного ручного запуска откройте обработку через функции для технического специалиста и нажмите ПроверитьАтрибутXML85. Разрешён только опыт в новой учебной базе.

  7. Файлы, строки внешнего XML, DTD, сеть, сертификаты и настройки безопасности не используются. URI urn:guide:owned-dom85 — идентификатор пространства имён, а не адрес запроса.

  8. Каждое повторное нажатие создаёт новый ДокументDOM с корнем demo и новым атрибутом id; прежние объекты не сохраняются в форме или базе.

&НаКлиенте
Процедура ПроверитьАтрибутXML85(Команда)
    Сообщить(ПроверитьСвойDOMНаСервере());
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПроверитьСвойDOMНаСервере()

    Документ = Новый ДокументDOM("", "demo");
    Корень = Документ.ЭлементДокумента;
    Атрибут = Документ.СоздатьАтрибут("id");
    Пока Атрибут.ДочерниеУзлы.Количество() > 0 Цикл
        Атрибут.УдалитьДочерний(Атрибут.ПервыйДочерний);
    КонецЦикла;
    Если Атрибут.Значение <> "" Тогда
        ВызватьИсключение "Начальное значение собственного атрибута должно быть пустым";
    КонецЕсли;

    ТекстА = Документ.СоздатьТекстовыйУзел("A");
    ТекстБ = Документ.СоздатьТекстовыйУзел("B");
    ТекстС = Документ.СоздатьТекстовыйУзел("C");
    ТекстД = Документ.СоздатьТекстовыйУзел("D");
    Атрибут.ДобавитьДочерний(ТекстА);
    Атрибут.ДобавитьДочерний(ТекстБ);
    Если Атрибут.Значение <> "AB" Или Атрибут.ДочерниеУзлы.Количество() <> 2 Тогда
        ВызватьИсключение "Два собственных текстовых узла должны дать AB";
    КонецЕсли;

    Вставленный = Атрибут.ВставитьПеред(ТекстС, ТекстБ);
    Если Не Вставленный.УзелИдентичен(ТекстС) Или Атрибут.Значение <> "ACB" Тогда
        ВызватьИсключение "C должен попасть перед фактическим B: ACB";
    КонецЕсли;
    Замененный = Атрибут.ЗаменитьДочерний(ТекстД, ТекстС);
    Если Не Замененный.УзелИдентичен(ТекстС) Или Атрибут.Значение <> "ADB" Тогда
        ВызватьИсключение "Метод возвращает прежний C, а значение должно стать ADB";
    КонецЕсли;

    Атрибут.Нормализовать();
    Если Атрибут.Значение <> "ADB" Или Атрибут.ДочерниеУзлы.Количество() <> 1 Тогда
        ВызватьИсключение "Нормализация должна объединить соседние текстовые узлы, сохранив ADB";
    КонецЕсли;
    Корень.УстановитьУзелАтрибута(Атрибут);
    Корень.УстановитьУзелАтрибутаИдентификатора(Атрибут, Истина);
    Найденный = Документ.ПолучитьЭлементПоИдентификатору("ADB");
    Если Найденный = Неопределено Тогда
        ВызватьИсключение "Не найден элемент с явно отмеченным ID";
    КонецЕсли;
    Если Не Найденный.УзелИдентичен(Корень) Тогда
        ВызватьИсключение "ID должен привести к своему корню, а не к другому узлу";
    КонецЕсли;

    URIУчебногоПространства = "urn:guide:owned-dom85";
    Корень.УстановитьСоответствиеПространстваИмен("g", URIУчебногоПространства, Ложь);
    Соответствия = Корень.ПолучитьСоответствияПространствИмен();
    Если Соответствия.Получить("g") <> URIУчебногоПространства Тогда
        ВызватьИсключение "В соответствии ключ — префикс g, значение — URI";
    КонецЕсли;
    Корень.ОтменитьСоответствиеПространстваИмен(URIУчебногоПространства);
    СоответствияПослеУдаления = Корень.ПолучитьСоответствияПространствИмен();
    Если СоответствияПослеУдаления.Получить("g") <> Неопределено Тогда
        ВызватьИсключение "Своё временное объявление пространства имён ещё существует";
    КонецЕсли;

    Корень.УстановитьУзелАтрибутаИдентификатора(Атрибут, Ложь);
    Если Документ.ПолучитьЭлементПоИдентификатору("ADB") <> Неопределено Тогда
        ВызватьИсключение "После снятия ID поиск не должен находить этот элемент";
    КонецЕсли;
    ЕдинственныйТекст = Атрибут.ПервыйДочерний;
    УдаленныйТекст = Атрибут.УдалитьДочерний(ЕдинственныйТекст);
    Если Не УдаленныйТекст.УзелИдентичен(ЕдинственныйТекст)
        Или Атрибут.Значение <> "" Или Атрибут.ДочерниеУзлы.Количество() <> 0 Тогда
        ВызватьИсключение "Удаляется реальный единственный текст; атрибут становится пустым";
    КонецЕсли;
    УдаленныйАтрибут = Корень.УдалитьУзелАтрибута(Атрибут);
    Если Не УдаленныйАтрибут.УзелИдентичен(Атрибут) Тогда
        ВызватьИсключение "УдалитьУзелАтрибута должен вернуть наш фактический атрибут";
    КонецЕсли;

    Атрибут.Значение = "A-01";
    Корень.УстановитьУзелАтрибута(Атрибут);
    Корень.УстановитьУзелАтрибутаИдентификатора(Атрибут, Истина);
    Восстановленный = Документ.ПолучитьЭлементПоИдентификатору("A-01");
    Если Восстановленный = Неопределено Тогда
        ВызватьИсключение "Повторно присоединённый ID A-01 не найден";
    КонецЕсли;
    Если Не Восстановленный.УзелИдентичен(Корень) Тогда
        ВызватьИсключение "Повторный поиск должен вернуть тот же собственный корень";
    КонецЕсли;
    Корень.УстановитьУзелАтрибутаИдентификатора(Атрибут, Ложь);
    Корень.УдалитьУзелАтрибута(Атрибут);
    Возврат "AB → ACB → ADB; текстовых узлов после нормализации: 1; ID и g проверены; повторный ID A-01 найден. Всё только в памяти.";
КонецФункции

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

  1. Новый ДокументDOM("", "demo") создаёт документ с собственным корнем без пространства имён. СоздатьАтрибут создаёт ещё не присоединённый атрибут; возможные начальные дочерние узлы удаляются через реальные ПервыйДочерний и ДочерниеУзлы.

  2. Четыре вызова СоздатьТекстовыйУзел создают A, B, C и D именно в этом документе. Два ДобавитьДочерний формируют значение AB и два текстовых узла. Значение атрибута — объединение текста его детей, а не коллекция отдельных атрибутов.

  3. ВставитьПеред получает настоящий B в качестве опорного ребёнка: C встаёт между A и B. Возвращённый узел проверяется на идентичность с C; значение проверяется как ACB.

  4. ЗаменитьДочерний получает новый D и старый C в таком порядке. Возвращается удалённый C, не вставленный D. Значение становится ADB; УзелИдентичен проверяет ссылку на прежний объект.

  5. Нормализовать объединяет соседние текстовые узлы: ADB остаётся тем же значением, а число детей становится равным одному. Не используйте после нормализации старые A/B/D как гарантированно остающиеся детьми.

  6. УстановитьУзелАтрибута присоединяет свой id к корню. Отдельный вызов УстановитьУзелАтрибутаИдентификатора с Истина делает его ID; одно имя id само по себе этого не гарантирует. Поиск ADB должен вернуть именно собственный корень.

  7. УстановитьСоответствиеПространстваИмен объявляет g → urn:guide:owned-dom85. ПолучитьСоответствияПространствИмен возвращает Соответствие: ключ g, значение URI. ОтменитьСоответствиеПространстваИмен принимает URI, не g; результат проверяется новым чтением.

  8. Перед изменением id его признак идентификатора снимается. УдалитьДочерний получает фактический единственный ребёнок и возвращает его; значение становится пустым. УдалитьУзелАтрибута удаляет сам id с корня и возвращает этот атрибут.

  9. Отсоединённый собственный атрибут можно заполнить A-01 и повторно присоединить к тому же документу. Повторный поиск ID проверяется, затем признак ID и атрибут снимаются. Только после всех проверок функция возвращает итоговую строку.

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

  1. Исходные контрольные значения должны пройти в порядке AB, ACB, ADB; ошибка на любом шаге прерывает опыт исключением вместо сообщения об успехе.

  2. До нормализации после замены три текстовых узла; после неё ровно один, значение ADB не меняется.

  3. ЗаменитьДочерний возвращает прежний C; УдалитьДочерний возвращает реальный единственный нормализованный текст; УдалитьУзелАтрибута возвращает собственный id.

  4. После отметки ID поиск ADB возвращает собственный demo. После снятия отметки тот же поиск возвращает Неопределено.

  5. До отмены пространства имён Соответствия.Получить("g") равно URI; после отмены новое соответствие не содержит g.

  6. После повторного присоединения атрибута поиск A-01 снова возвращает тот же корень. Второе нажатие команды воспроизводит опыт с новым документом.

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

Сообщение: AB → ACB → ADB; текстовых узлов после нормализации: 1; ID и g проверены; повторный ID A-01 найден. Всё только в памяти.

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

  1. Это урок об атрибуте и его текстовых дочерних узлах, а не о дочерних XML-элементах. Нельзя заменить текстовые узлы произвольными элементами.

  2. Все узлы создаются одним ДокументDOM. Перенос узла из другого документа без предусмотренного импортирования может вызвать исключение.

  3. ВставитьПеред и ЗаменитьДочерний требуют существующий дочерний узел этого атрибута. Совпадение текста не делает другой объект тем же ребёнком.

  4. Установка Атрибут.Значение удаляет прежних детей и создаёт текстовый узел; она используется только на этапе повторного заполнения, а не между шагами A/B/C/D.

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

  6. Имя id и пользовательский признак ID — разные вещи. В этом документе нет DTD/XSD; метод не изменяет схему и не является проверкой XML по схеме.

  7. ОтменитьСоответствиеПространстваИмен получает URI. Объявление префикса не является переименованием корня и не загружает данные из сети.

  8. Если документ получен извне, read-only, DTD с атрибутами по умолчанию и обработка сущностей потребуют отдельного сценария. Здесь эти условия намеренно исключены созданием собственного документа.

  9. DOM-объекты остаются внутри серверной функции. Возвращается только строка: попытка вернуть DOM в тонкий клиент — другой, неподдержанный данным уроком вариант.

  10. Статическое совпадение имён и сигнатур со справкой8.5.1.1343 не доказывает выполнение в 1С. Перед использованием новичок должен пройти F7 и все проверки в своём стенде.

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

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

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

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

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