Back to top

Работа с DOM

Опубликовано e-1c@mail.ru - пт, 12/29/2017 - 07:48

При работе с XML в 1С версии 8 есть возможность использовать DOM — Document Object Model (Объектная модель документа). Модель DOM имеет широкие возможности для работы с элементами и аттрибутами XML как в плане их чтения, так и изменения. В отличие от таких объектов как ЧтениеXML и ЗаписьXML, которые работают с файлом или строкой XML путем последовательного чтения или записи элементов и аттрибутов, объект ДокументDOM позволяет, например, получить выборку элементов XML по имени и далее обработать их в цикле.

Допустим у нас есть 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>	
 

Читать будем узлы

Создать объект ДокументDOM можно при помощи объекта ПостроительDOM

	л_ЧтениеХМЛ	= Новый ЧтениеXML; 
	л_ЧтениеХМЛ.ОткрытьФайл("D:\musor\test.xml"); 
 
	л_ПостроительДОМ     = Новый ПостроительDOM; 
	л_ДОМДокумент        = л_ПостроительДОМ.Прочитать(л_ЧтениеХМЛ); 

А теперь выберем узлы и обойдем их в цикле

	л_СписокУзловДокумент = л_ДОМДокумент.ПолучитьЭлементыПоИмени("DocumentObject.ПриемНаРаботуВОрганизацию"); 
	Для каждого л_УзелДокумент Из л_СписокУзловДокумент Цикл 
 
	КонецЦикла;

И в итоге доработаем наш код таким образом, чтобы после чтения мы смогли записать прочитанные документы в базу 1С:

	л_ЧтениеХМЛ = Новый ЧтениеXML; 
	л_ЗаписьХМЛ = Новый ЗаписьXML; 
	л_ЗаписьДОМ = Новый ЗаписьDOM; 
 
	л_ЧтениеХМЛ.ОткрытьФайл("D:\musor\test.xml"); 
 
	л_ПостроительДОМ = Новый ПостроительDOM; 
	л_ДОМДокумент = л_ПостроительДОМ.Прочитать(л_ЧтениеХМЛ); 
 
	л_СписокУзловДокумент = л_ДОМДокумент.ПолучитьЭлементыПоИмени("DocumentObject.ПриемНаРаботуВОрганизацию"); 
	Для каждого л_УзелДокумент Из л_СписокУзловДокумент Цикл 
 
		л_ЗаписьХМЛ.УстановитьСтроку(); 
		л_ЗаписьДОМ.Записать(л_УзелДокумент, л_ЗаписьХМЛ); 
		л_СтрокаХМЛ = л_ЗаписьХМЛ.Закрыть(); 
 
		л_ЧтениеХМЛ.УстановитьСтроку(л_СтрокаХМЛ); 
		л_ДокументОбъект = ПрочитатьXML(л_ЧтениеХМЛ); 
		л_ДокументОбъект.Записать(); 
 
	КонецЦикла;
	

При использовании DOM необходимо учесть, что он использует оперативную память и на больших объемах данных могут возникнуть проблемы. С другой стороны удобства использования и читабельность кода по сравнению с последовательным чтением очевидны. Причем формирование выборки путем поиска узлов по имени это далеко не единственный вариант.

Теги