Поскольку DOM-объект жрет дофига памяти, крупные ХМЛ-ки приходится разбирать через ПоследовательноСчитваемыйДокумент. Это, как бы, общеизвестно.
Рисуя очередную ковырялку ХМЛ-ки, озарился идеей написать класс, который бы разбирал бы ХМЛ, скажем, в древовидную структуру на основе вложенных таблиц значений
(например, такой структуры:
Функция СоздатьВетвь()
тзВозврат = СоздатьОбъект("ТаблицаЗначений");
тзВозврат.НоваяКолонка("Имя");
тзВозврат.НоваяКолонка("Значение");
тзВозврат.НоваяКолонка("сзАтрибуты");
тзВозврат.НоваяКолонка("тзПотомки");
Возврат тзВозврат;
КонецФункции // СоздатьВетвь
)
Сходу сделать цивильный рекурсивный обход не получилось, по причине того, что узлы вида
<value>4</value> и <node><subnode>...</subnode></node> приходится обрабатывать абсолютно по разному.
Узел с подузлами:
ТипТэга = ХМЛ.Спуститься(); //спустились на уровень
Пока ТипТэга = 1 Цикл
...
ТипТэга = ОбработатьУзел(...);
Если ТипТэга <> 4 Тогда
ТипТэга = ХМЛ.Следующий();
КонецЕсли;
КонецЦикла;
Возврат ТипТэга;
А для получения конкретного значения узла:
ХМЛ.ТекущийЭлементВВидеОбъекта().Значение
.
Проблема в том, что ТекущийЭлементВВидеОбъекта() сбрасывает позиционирование в ХМЛ-файле (точнее, пропускает в обходе текущую ветвь со всему подузлами); а определить в процессе обхода, что текущий узел содержит значение мы можем только увидев, что
ХМЛ.Спуститься() = 1, и сразу же ХМЛ.Следующий() = 3. Но в этот момент позиционирование уже прошло узел и ХМЛ.ТекущийЭлементВВидеОбъекта() уже относится сааавсем к другой ветке.
Путей решения вижу 2, но оба каких-то кривых.
Вариант 1:
в цикле
Пока ТипТэга = 1 Цикл делать ХМЛ.ТекущийЭлементВВидеСтроки(), потом создавать новый объект ХМЛ-анализатора, связывать его со строкой, обходить по узлам новый объект.
Вариант 2:
в цикле
Пока ТипТэга = 1 Цикл делать ХМЛ.ТекущийЭлементВВидеОбъекта() - но на больших ХМЛках мы будем точно так же пытаться построить ДОМ-объект с падением 1Ски в виде закономерного итога.