Как преобразовать HTML или неструктурированную строку в корректный формат XML в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике разработчика 1С часто возникают задачи, когда необходимо преобразовать данные из веб-форматов (HTML) или «сырых» строк в строго структурированный XML-документ. Это может быть нужно для интеграции с внешними системами, парсинга сайтов или просто для приведения документа к читаемому виду (так называемый Pretty Print). В данной статье мы подробно разберем несколько подходов: от простых манипуляций со строками до использования мощных встроенных инструментов платформы, таких как DOM-модель и фабрика XDTO.

Метод 1. Использование Фабрики XDTO для нормализации XML-структуры

Если ваша исходная строка уже имеет структуру, близкую к XML (как в примере автора темы), но требует корректной перепаковки или форматирования, мы можем воспользоваться механизмом XDTO (XML Data Transfer Objects). Этот метод позволяет прочитать данные в объектную модель и сразу записать их обратно в строку или файл.

Проанализируем программный код, который позволяет это реализовать:


// Исходные данные в виде строки
ДанныеXML = "<Xml><Document></Document></Xml>";

// Инициализируем чтение
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ДанныеXML);

// Используем стандартную фабрику для создания объекта
// Если схема (XSD) не задана, 1С попытается прочитать структуру «как есть»
Попытка
    ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
Исключение
    Сообщить("Ошибка при чтении структуры: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Теперь запишем объект обратно в строку, чтобы получить чистый XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();

// Здесь можно применить настройки форматирования (рассмотрим ниже)
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);

Результат = ЗаписьXML.Закрыть();

Этот способ хорош тем, что ФабрикаXDTO автоматически проверяет валидность тегов и вложенность элементов. Если структура исходного текста нарушена, система выдаст исключение, что позволит нам обработать ошибку на раннем этапе.

Метод 2. Преобразование «грязного» HTML с помощью Построителя DOM

Основная сложность при работе с реальным HTML заключается в его «свободном» синтаксисе: незакрытые теги (например, <br> или <img>), отсутствие кавычек в атрибутах и прочие нюансы, которые делают документ невалидным с точки зрения XML. Для решения этой задачи в 1С предусмотрены объекты ЧтениеHTML и ПостроительDOM.

Разберем алгоритм действий по шагам:

  1. Загрузка HTML: Мы используем специализированный объект чтения, который умеет обрабатывать особенности веб-верстки.
  2. Создание DOM-модели: Построитель превращает плоский текст в иерархическое дерево объектов.
  3. Выгрузка в XML: Мы используем ЗаписьDOM для преобразования дерева обратно в текст, но уже по правилам XML.

Рассмотрим пример кода:


// Предположим, у нас есть строка с «грязным» HTML
ТекстHTML = "<div><p>Текст без закрытого тега<br>Вторая строка</div>";

// Создаем чтение HTML
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.УстановитьСтроку(ТекстHTML);

// Строим дерево DOM
Построитель = Новый ПостроительDOM;
ДокументDOM = Построитель.Прочитать(ЧтениеHTML);

// Теперь записываем этот DOM в формат XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();

ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);

РезультатXML = ЗаписьXML.Закрыть();
// На выходе мы получим валидный XML, где тег <br> будет закрыт как <br/>

Метод 3. Настройка форматирования вывода (Pretty Print)

Часто под вопросом «как привести к виду» пользователи подразумевают визуальное оформление XML: наличие отступов, табуляции и переносов строк. В 1С это реализуется через объект ПараметрыЗаписиXML.

Выясним, как настроить красивое отображение документа:


ЗаписьXML = Новый ЗаписьXML;

// Настраиваем параметры записи
Настройки = Новый ПараметрыЗаписиXML;
Настройки.Отступ = Истина; // Включаем иерархические отступы
Настройки.СимволОтступа = Символы.Таб; // Или используйте пробелы
Настройки.ВариантУправленияПустымиЭлементами = ВариантУправленияПустымиЭлементамиXML.ЗаписыватьЗакрывающийТег;

// Указываем настройки при инициализации строки или файла
ЗаписьXML.УстановитьСтроку("UTF-8", Настройки);

// После этого любая запись через Фабрику XDTO или ЗаписьDOM 
// будет формировать красивый структурированный текст.

Метод 4. Использование регулярных выражений для предварительной очистки

Если HTML слишком сложный или содержит элементы, которые не нужны в итоговом XML (например, скрипты или стили), мы можем воспользоваться объектом VBScript.RegExp. Это полезно для предварительной фильтрации данных перед тем, как передавать их встроенным парсерам 1С.

Проанализируем ситуацию: нам нужно удалить все блоки <script>...</script>, чтобы они не мешали созданию XML-дерева.


РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.MultiLine = Истина;
РегВыражение.Global = Истина;
РегВыражение.IgnoreCase = Истина;

// Паттерн для удаления скриптов
РегВыражение.Pattern = "<script[\s\S]*?>[\s\S]*?</script>";
ОчищенныйТекст = РегВыражение.Replace(ИсходныйHTML, "");

// Теперь ОчищенныйТекст можно смело отдавать ПостроителюDOM

Метод 5. Работа через COM-объект Microsoft HTML File

В операционных системах Windows доступна библиотека MSHTML, которую использует Internet Explorer. Это мощный инструмент, который может «переварить» даже самый некорректный код и выдать готовую структуру. Рассмотрим этот вариант как альтернативу для сложных случаев.


HTMLДокумент = Новый COMОбъект("HTMLFile");
HTMLДокумент.open();
HTMLДокумент.write(ТекстHTML);
HTMLДокумент.close();

// Получаем корневой элемент
Элемент = HTMLДокумент.documentElement;
// Свойство innerHTML или рекурсивный обход коллекции childNodes 
// позволит нам собрать нужные данные для XML.

Резюме: Выбор метода зависит от качества исходных данных. Для простого форматирования уже готового XML идеально подходит Фабрика XDTO с настройками отступов. Если же перед вами стоит задача превратить реальную веб-страницу в XML-данные, наиболее надежным и современным способом в 1С является связка ЧтениеHTML + ПостроительDOM. Она минимизирует количество ошибок и позволяет работать с данными как с набором объектов, а не как с текстом.

← На главную