Тип: Строка. Текстовое содержимое узла HTML. Содержит текстовое значение узла и всех его потомков. Значение не содержит разметки. Никакой нормализации пробельных символов не выполняется, и возвращаемая строка не содержит пробельных символов в содержимом элемента (см. свойство ЭтоПробельныеСимволыЭлемента). Принцип формирования текстового значения узла: Элемент, Атрибут, ФрагментДокумента - объединение текстового содержимого каждого из дочерних узлов, исключая Комментарий. Пустая строка, если дочерних узлов нет; Текст, Комментарий - значение свойства ЗначениеУзла; Документ, ОпределениеТипаДокумента - Неопределено.
Полное описание, параметры и ограничения
ЭлементРазметкаHTML.ТекстовоеСодержимое (HTMLHtmlElement.TextContent)
ЭлементРазметкаHTML (HTMLHtmlElement)
ТекстовоеСодержимое (TextContent)
Доступен, начиная с версии 8.2.
Использование:
Чтение и запись.
Описание:
Тип: Строка.
Текстовое содержимое узла HTML.
Содержит текстовое значение узла и всех его потомков. Значение не содержит разметки.
Никакой нормализации пробельных символов не выполняется, и возвращаемая строка не содержит пробельных символов в содержимом элемента (см. свойство ЭтоПробельныеСимволыЭлемента).
Принцип формирования текстового значения узла:
Элемент, Атрибут, ФрагментДокумента - объединение текстового содержимого каждого из дочерних узлов, исключая Комментарий. Пустая строка, если дочерних узлов нет;
Текст, Комментарий - значение свойства ЗначениеУзла;
Документ, ОпределениеТипаДокумента - Неопределено.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Различить тот же HTML-документ и равную глубокую копию
Одна переменная ссылается на исходный документ, другая — на его глубокую копию. Проверяем идентичность и структурное равенство, затем меняем текст только в копии.
Где и как запускать
Полный серверный общий модуль УчебныйДокументHTML85. Свой HTML создаётся строкой и разбирается в памяти, без браузера и внешних источников.
Подготовка
Используйте отдельную учебную базу 8.5.1.1343. Создайте общий модуль УчебныйДокументHTML85: Сервер — Да, Клиент — Нет, Глобальный — Нет, Вызов сервера — Нет, Привилегированный — Нет.
Вставьте весь приведённый модуль одного урока. В своей управляемой учебной обработке создайте команду и клиентский обработчик, вызывающий свою процедуру с директивой &НаСервереБезКонтекста. В её тело вставьте УчебныйДокументHTML85.ВыполнитьПример();.
Источник HTML полностью записан в коде: свой вымышленный заказ, покупатель, книга, ручка и элементы с явно заданными id. ЧтениеHTML и ПостроительDOM получают строку, а не URL или внешний файл.
Разбор HTML в этом уроке не открывает браузер, не отправляет форму, не загружает картинки и не исполняет JavaScript. Файлы, сеть, печать, рабочие документы и регистры не используются.
Каждый запуск создаёт новый собственный документ в памяти. Поставьте точку останова перед конечными Сообщить и исследуйте Документ, его ЭлементДокумента и указанные переменные урока в серверном отладчике.
ДокументHTML — корневой объект дерева, а его ЭлементДокумента, Тело и отдельный блок — другие узлы. Одинаковые имена методов не означают одинаковые правила допустимых дочерних узлов.
Результаты ниже ожидаемые. В 1С код не запускался; статическая сверка сигнатур и readonly не подтверждает все особенности реализации HTML DOM вашей среды. Выполните проверки только на своём учебном стенде.
Процедура ВыполнитьПример() Экспорт
HTML = "<html><head><title>Учебный заказ</title><meta id='meta' name='description' content='Вымышленный заказ'></head>
|<body id='body'><p id='note'>Заказ существует только в памяти</p><pre id='code'>A-01: 3
|B-02: 1</pre>
|<form id='order' name='order' action='' method='get'>
|<input id='customer' name='customer' type='text' value='Учебный покупатель'>
|<input id='accepted' name='accepted' type='checkbox' value='yes'>
|<button id='preview' name='preview' type='button' value='preview'>Предпросмотр</button></form>
|<table id='items' summary='Книга и ручка'><caption id='caption'>Товары</caption><colgroup><col id='column'></colgroup><tbody>
|<tr id='book'><td id='book-name'>Книга</td><td>3</td></tr><tr id='pen'><td>Ручка</td><td>1</td></tr>
|</tbody></table><a id='help' name='help' href='#note'>Пояснение</a><img id='logo' alt='Учебная картинка без источника'>
|</body></html>";
Чтение = Новый ЧтениеHTML;
Чтение.УстановитьСтроку(HTML);
Попытка
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Чтение);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если ТипЗнч(Документ) <> Тип("ДокументHTML") Тогда
ВызватьИсключение "Ожидался ДокументHTML, а не XML-документ";
КонецЕсли;
Документ.Нормализовать();
ТаЖеСсылка = Документ;
Копия = Документ.КлонироватьУзел(Истина);
Если ТипЗнч(Копия) <> Тип("ДокументHTML") Тогда
ВызватьИсключение "Ожидалась глубокая копия HTML-документа";
КонецЕсли;
Копия.Нормализовать();
Сообщить(Документ.УзелИдентичен(ТаЖеСсылка));
Сообщить(Не Документ.УзелИдентичен(Копия));
Сообщить(Документ.УзелРавен(Копия));
Сообщить(Документ.УзелРавен(Документ));
ИсходноеПояснение = Документ.ПолучитьЭлементПоИдентификатору("note");
ПояснениеКопии = Копия.ПолучитьЭлементПоИдентификатору("note");
Если ИсходноеПояснение = Неопределено Или ПояснениеКопии = Неопределено Тогда
ВызватьИсключение "В обеих собственных версиях нужно пояснение note";
КонецЕсли;
ИсходныйТекст = ИсходноеПояснение.ТекстовоеСодержимое;
ПояснениеКопии.ТекстовоеСодержимое = "Изменена только учебная копия";
Сообщить(ИсходноеПояснение.ТекстовоеСодержимое = ИсходныйТекст);
Сообщить(Не Документ.УзелРавен(Копия));
КонецПроцедурыРазбор по шагам
Создать свой исходный документ из строки и нормализовать его перед сравнением.
Присваивание ТаЖеСсылка=Документ не копирует дерево. УзелИдентичен проверяет ссылку на тот же объект, а не сходство его текста.
КлонироватьУзел(Истина) создаёт глубокую копию. Проверяем её тип перед использованием свойств документа.
Нормализовать обе версии: по справке нормализация влияет на структурное равенство узлов.
Исходный документ идентичен ТаЖеСсылка, не идентичен копии, но равен ей по структуре. Самому себе он также равен.
Найти собственное пояснение note в каждой версии и проверить оба результата на Неопределено. Менять ТекстовоеСодержимое только найденного узла копии.
Сохранность исходного текста показывает независимость глубокого дерева. После изменения копия уже структурно не равна оригиналу.
Как проверить результат
Шесть конечных сравнений должны дать Истина: четыре до правки и два после неё.
В отладчике оригинальное note сохраняет текст Заказ существует только в памяти, копия содержит новое пояснение.
УзелИдентичен и УзелРавен отвечают на разные вопросы. Не используйте равенство текста как доказательство общего объекта.
Ожидаемый результат
Различие ссылочной идентичности и структурного равенства показано на полноценном собственном документе и его изменённой копии.
На что обратить внимание
УзелРавен не сравнивает пользовательские данные и не учитывает ряд служебных ссылок документа-владельца и родителей.
Слово Истина в КлонироватьУзел относится к глубине копирования, не к записи документа в базу.
Нельзя применять этот код к неизвестной странице пользователя: оба документа созданы в этом уроке.
Никакой файл или окно браузера не изменяется; запуска в 1С не было.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Проверить паспорт и границы пустых HTML-элементов
Для каждого созданного элемента читаем имена, тип, текст и атрибуты. До перехода к детям проверяем, существуют ли они.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Используйте учебную базу платформы 8.5.1.1343 и серверную процедуру учебного общего модуля. Каждый пример выполняйте отдельно.
Все данные заказа вымышлены и находятся в строке. ЧтениеHTML разбирает данные, но не является браузером: форма не отправляется, ссылки не открываются, картинки не скачиваются.
Никакие файлы, адреса сайтов, токены и документы информационной базы не нужны. Не заменяйте учебную строку произвольным внешним HTML без отдельной проверки безопасности.
Индексы коллекций начинаются с нуля. Перед обращением к найденному узлу проверяйте Неопределено; перед специальными свойствами элемента проверяйте его тип.
HTML = "<html><head><title>Учебный заказ</title><meta id='meta' name='description' content='Вымышленный заказ'></head>
|<body id='body'><p id='note'>Заказ существует только в памяти</p><pre id='code'>A-01: 3
|B-02: 1</pre>
|<form id='order' name='order' action='' method='get'>
|<input id='customer' name='customer' type='text' value='Учебный покупатель'>
|<input id='accepted' name='accepted' type='checkbox' value='yes'>
|<button id='preview' name='preview' type='button' value='preview'>Предпросмотр</button></form>
|<table id='items' summary='Книга и ручка'><caption id='caption'>Товары</caption><colgroup><col id='column'></colgroup><tbody>
|<tr id='book'><td id='book-name'>Книга</td><td>3</td></tr><tr id='pen'><td>Ручка</td><td>1</td></tr>
|</tbody></table><a id='help' name='help' href='#note'>Пояснение</a><img id='logo' alt='Учебная картинка без источника'>
|</body></html>";
Чтение = Новый ЧтениеHTML;
Чтение.УстановитьСтроку(HTML);
Попытка
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Чтение);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если ТипЗнч(Документ) <> Тип("ДокументHTML") Тогда
ВызватьИсключение "Ожидался ДокументHTML, а не XML-документ";
КонецЕсли;
Ожидаемые = Новый Соответствие;
Ожидаемые.Вставить("guide-section", "ЭлементHTML");
Ожидаемые.Вставить("div", "ЭлементБлокHTML");
Ожидаемые.Вставить("pre", "ЭлементФорматированногоТекстаHTML");
Ожидаемые.Вставить("form", "ЭлементФормаHTML");
Ожидаемые.Вставить("input", "ЭлементВводаHTML");
Ожидаемые.Вставить("button", "ЭлементКнопкаHTML");
Ожидаемые.Вставить("table", "ЭлементТаблицаHTML");
Ожидаемые.Вставить("tr", "ЭлементСтрокаТаблицыHTML");
Ожидаемые.Вставить("td", "ЭлементЯчейкаТаблицыHTML");
Ожидаемые.Вставить("col", "ЭлементКолонкаТаблицыHTML");
Ожидаемые.Вставить("caption", "ЭлементЗаголовокТаблицыHTML");
Ожидаемые.Вставить("a", "ЭлементЯкорьHTML");
Ожидаемые.Вставить("img", "ЭлементКартинкаHTML");
Ожидаемые.Вставить("meta", "ЭлементМетаHTML");
Ожидаемые.Вставить("link", "ЭлементСвязьHTML");
Ожидаемые.Вставить("head", "ЭлементЗаголовокHTML");
Ожидаемые.Вставить("html", "ЭлементРазметкаHTML");
Ожидаемые.Вставить("hr", "ЭлементЛинияHTML");
Ожидаемые.Вставить("script", "ЭлементСкриптHTML");
Ожидаемые.Вставить("iframe", "ЭлементПлавающийФреймHTML");
Ожидаемые.Вставить("frame", "ЭлементФреймHTML");
Ожидаемые.Вставить("frameset", "ЭлементНаборФреймовHTML");
Ожидаемые.Вставить("embed", "ЭлементВставкаHTML");
Ожидаемые.Вставить("object", "ЭлементОбъектHTML");
Ожидаемые.Вставить("applet", "ЭлементАплетHTML");
Для Каждого Пара Из Ожидаемые Цикл
Узел = Документ.СоздатьЭлемент(Пара.Ключ);
Если ТипЗнч(Узел) <> Тип(Пара.Значение) Тогда
ВызватьИсключение "Фактический тип фабрики отличается для " + Пара.Ключ;
КонецЕсли;
Сообщить(СтрШаблон("%1: %2 / %3 / %4", Пара.Ключ,
Узел.ИмяУзла, Узел.ИмяЭлемента, Узел.ТипУзла));
Сообщить(СтрШаблон("Локальное имя: %1; префикс: %2", Узел.ЛокальноеИмя, Узел.Префикс));
Сообщить("Значение узла: " + Строка(Узел.ЗначениеУзла));
Сообщить("Текст: " + Узел.ТекстовоеСодержимое);
Сообщить(Узел.ДочерниеУзлы.Количество() = 0);
Сообщить(Не Узел.ЕстьДочерниеУзлы());
Сообщить(Узел.ПервыйДочерний = Неопределено);
Сообщить(Узел.ПоследнийДочерний = Неопределено);
Сообщить(Узел.ПредыдущийСоседний = Неопределено);
Сообщить(Узел.СледующийСоседний = Неопределено);
Сообщить(Узел.ЕстьАтрибуты() = (Узел.Атрибуты.Количество() > 0));
КонецЦикла;Разбор по шагам
Пустые элементы созданы отдельно, а не найдены в заполненном внешнем документе.
ИмяУзла обозначает тег; ЗначениеУзла не заменяет значение input или текст кнопки.
Узел не вставлен в дерево, поэтому у него нет соседей; у пустого элемента нет детей.
Фактическое количество атрибутов сопоставляем с ЕстьАтрибуты, не предполагая отсутствие значений по умолчанию.
Как проверить результат
В каждом блоке семь сравнений Истина: пустые дети, границы и согласованность признака атрибутов.
Вывод имён и значений изучите отдельно: регистр тегов и представление Неопределено не объявлены бизнес-данными.
Ожидаемый результат
Новичок видит, какие свойства общего узла допустимы и где нужна проверка границы.
На что обратить внимание
Не обращайтесь к ПервыйДочерний.Данные без проверки наличия ребёнка.
У ЭлементТелоHTML в экспортированной справке другой набор свойств, поэтому он исключён из списка.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.