При работе с XML-документами в 1С разработчики часто сталкиваются с непониманием того, как устроен объект ПостроительDOM. Основная сложность заключается в том, что DOM (Document Object Model) представляет XML-файл как полное дерево узлов, включая не только теги, но и текстовые пробелы, переносы строк и структуру документа. Давайте разберем, как правильно обрабатывать такие данные, чтобы избежать ошибок и получить доступ к нужной информации.
Когда вы используете ПостроительDOM, вы получаете объект документа, состоящий из узлов различных типов. Многие новички ожидают, что цикл по ДочерниеУзлы вернет только список тегов, но на деле в коллекции присутствуют и узлы типа #text. Эти узлы представляют собой пробелы и переносы строк, которые разделяют элементы в исходном XML-файле.
Чтобы эффективно работать с таким деревом, важно использовать рекурсивный подход. Рассмотрим пример универсальной процедуры, которая корректно проходит по всем узлам документа, вне зависимости от их вложенности:
Процедура ПрочитатьУзел(ТекущийУзел, УровеньИерархии)
Составляющие = Новый Массив;
Для Индекс = 1 По УровеньИерархии Цикл
Составляющие.Добавить(Символы.Таб);
КонецЦикла;
Составляющие.Добавить(ТекущийУзел.ИмяУзла + ?(ПустаяСтрока(ТекущийУзел.ЗначениеУзла), "", "=" + ТекущийУзел.ЗначениеУзла));
// Если у узла есть атрибуты, переберем их
Если ТекущийУзел.Атрибуты <> Неопределено Тогда
Для Индекс = 0 По ТекущийУзел.Атрибуты.Количество() - 1 Цикл
Составляющие.Добавить(" [атрибут]" + ТекущийУзел.Атрибуты[Индекс].Имя + "=" + ТекущийУзел.Атрибуты[Индекс].Значение);
КонецЦикла;
КонецЕсли;
Сообщить(СтрСоединить(Составляющие));
// Рекурсивный обход всех дочерних узлов
Для Каждого Дочерний Из ТекущийУзел.ДочерниеУзлы Цикл
ПрочитатьУзел(Дочерний, УровеньИерархии + 1);
КонецЦикла;
КонецПроцедуры
Часто возникают вопросы при попытке извлечь информацию из узлов и их атрибутов. Рассмотрим основные свойства и методы, с которыми предстоит работать:
АтрибутDOM нет свойства Значение (иногда возникает путаница с описанием в справке), данные хранятся в свойстве Значение самого объекта атрибута.Если вам нужно получить значение конкретного атрибута, используйте метод коллекции ПолучитьИменованныйЭлемент. Обратите внимание на следующий пример:
// Предположим, мы нашли нужный узел
ОшибкаDOM = ТекущийУзел;
Атрибут = ОшибкаDOM.Атрибуты.ПолучитьИменованныйЭлемент("ErrorName");
Если Атрибут <> Неопределено Тогда
Сообщить("Значение атрибута: " + Атрибут.Значение);
КонецЕсли;
Перед тем как приступать к написанию логики обработки, проверьте корректность самого XML-файла. ПостроительDOM очень строго относится к синтаксису. Если файл содержит несколько заголовков <?xml version='1.0'?>, построение дерева завершится ошибкой. В таких случаях:
СтрЗаменить.ДочерниеУзлы всегда проверяйте имя узла. Если оно равно #text — это просто форматирование файла, его можно игнорировать.ЧтениеXML в потоковом режиме, что позволит читать файл последовательно, не затрачивая ресурсы на построение полной модели DOM в памяти.Работа с ПостроительDOM требует внимательности к иерархии узлов. Использование рекурсии — лучший способ гарантированно обработать весь XML, не пропуская ни одного вложенного элемента. Разберитесь с типами узлов, и вы сможете легко манипулировать данными любой сложности. При необходимости разбора данных без ручного обхода дерева можно воспользоваться обработкой для чтения XML в структуру.