рубрики: XML | Дата: 12 декабря, 2015
Кроме всего прочего при работе с XML в 1С версии 8 есть возможность использовать DOM — Document Object Model (Объектная модель документа). Модель DOM имеет широкие возможности для работы с элементами и аттрибутами XML как в плане их чтения, так и изменения. В отличие от таких объектов как ЧтениеXML и ЗаписьXML, которые работают с файлом или строкой XML путем последовательного чтения или записи элементов и аттрибутов, объект ДокументDOM позволяет, например, получить выборку элементов XML по имени и далее обработать их в цикле.
Рассмотрим это на примере (код написан для платформы 8.2). Допустим у нас есть XML файл с выгруженными документами «ПриемНаРаботуВОрганизацию». Создать такой файл можно при помощи стандартной обработки «ВыгрузкаЗагрузкаДанныхXML.epf» с диска ИТС. Файл имеет следующий вид:
<xml version="1.0" encoding="UTF-8"?>
<V8Exch:_1CV8DtUD xmlns:V8Exch="http://www.1c.ru/V8/1CV8DtUD/" xmlns:v8="http://v8.1c.ru/data" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<V8Exch:Data>
<DocumentObject.ПриемНаРаботуВОрганизацию>
<Ref>17dc486c-3d0b-11e2-82dc-000c29a93e6f</Ref>
.................................................
.................................................
</DocumentObject.ПриемНаРаботуВОрганизацию>
<DocumentObject.ПриемНаРаботуВОрганизацию>
<Ref>2df962d4-3e9c-11e2-82dc-000c29a93e6f</Ref>
.................................................
.................................................
</DocumentObject.ПриемНаРаботуВОрганизацию>
</V8Exch:Data>
</V8Exch:_1CV8DtUD>
Читать будем узлы <DocumentObject.ПриемНаРаботуВОрганизацию>
Создать объект ДокументDOM можно при помощи объекта ПостроительDOM
л_ЧтениеХМЛ = Новый ЧтениеXML;
л_ЧтениеХМЛ.ОткрытьФайл("D:\musor\test.xml");
л_ПостроительДОМ = Новый ПостроительDOM;
л_ДОМДокумент = л_ПостроительДОМ.Прочитать(л_ЧтениеХМЛ);
А теперь выберем узлы <DocumentObject.ПриемНаРаботуВОрганизацию> и обойдем их в цикле
л_СписокУзловДокумент = л_ДОМДокумент.ПолучитьЭлементыПоИмени("DocumentObject.ПриемНаРаботуВОрганизацию");
Для каждого л_УзелДокумент Из л_СписокУзловДокумент Цикл
КонецЦикла;
И в итоге доработаем наш код таким образом, чтобы после чтения мы смогли записать прочитанные документы в базу 1С:
л_ЧтениеХМЛ = Новый ЧтениеXML;
л_ЗаписьХМЛ = Новый ЗаписьXML;
л_ЗаписьДОМ = Новый ЗаписьDOM;
л_ЧтениеХМЛ.ОткрытьФайл("D:\musor\test.xml");
л_ПостроительДОМ = Новый ПостроительDOM;
л_ДОМДокумент = л_ПостроительДОМ.Прочитать(л_ЧтениеХМЛ);
л_СписокУзловДокумент = л_ДОМДокумент.ПолучитьЭлементыПоИмени("DocumentObject.ПриемНаРаботуВОрганизацию");
Для каждого л_УзелДокумент Из л_СписокУзловДокумент Цикл
л_ЗаписьХМЛ.УстановитьСтроку();
л_ЗаписьДОМ.Записать(л_УзелДокумент, л_ЗаписьХМЛ);
л_СтрокаХМЛ = л_ЗаписьХМЛ.Закрыть();
л_ЧтениеХМЛ.УстановитьСтроку(л_СтрокаХМЛ);
л_ДокументОбъект = ПрочитатьXML(л_ЧтениеХМЛ);
л_ДокументОбъект.Записать();
КонецЦикла;
При использовании DOM необходимо учесть, что он использует оперативную память и на больших объемах данных могут возникнуть проблемы. С другой стороны удобства использования и читабельность кода по сравнению с последовательным чтением очевидны. Причем формирование выборки путем поиска узлов по имени это далеко не единственный вариант.
Добавить комментарий