Разбор XML документа - почти все возможные способы

Программирование - Практика программирования

XML DOM XPath

553
К вам пришел XML документ, как получить из него данные для обработки в 1С.
ЧтениеXML,  ДокументDOM, XPath, ФабрикаXDTO, ПакетыXDTO в сравнении.

 

При обмене данными, как бы он не производился  ( через файлы, через HTTP запросы или еще каким либо другим путем ) все равно основным форматом обмена является XML. В 1С существует несколько способов обработки XML  документов    какой из них выбрать по критерию логической простоты и быстродействия?  Для практической проверки различных методов был создан XML документ вида


 

Задачей всех проверяемых методов было получение из XML файла массива, состоящего из структур со свойствами Номер, Дата, Поставщик, Состав, причем свойство Состав само является массивом структур со свойствами Номенклатура и Количество.  

 

Первый метод – простое последовательное чтение XML.


 

Текущее положение в XML документе отслеживается в переменной  ТекущийПуть и при поступлении текстового узла на  основании этой переменной заполняются (или игнорируются) соответствующие данные 1С. Конечно, не совсем корректно оценивать логическую сложность программы в строках исходного текста, но тем не менее это самый большой объем  из всех методов  - 64 строки. Что касается быстродействия (оно проверялось на компьютере памятью в 8 Гб и процессором Intel i7 2.2 Ггц, было создано два файла один на 10 тысяч записей объемом 10 мегабайт, другой на 100 тысяч и 100 мегабайт соответственно) , то на файле 10 000 записей полная обработка заняла 30 секунд  и на файле в 100 мегабайт линейно увеличилась в 10 раз.

 

Второй метод – получение из XML файла документа DOM и последовательный перебор всех узлов полученного документа

 

 

Логически этот метод весьма незначительно проще прямого ЧтенияXML (57 строк кода против 62), а вот с быстродействие картина интересная: для файла в 10 тысяч записей быстродействие составило 12 секунд (быстрее более чем в два раза) ,  но для файла со 100 тысячами записей резко поднялась до 1000 секунд (медленнее более чем в три раза).

  

Третий метод подобен второму, но вместо последовательного перебора узлов применен отбор требуемых узлов в DOM документе  с помощью  выражений XPath .

 

Этот метод немного проще чем простой перебор узлов в DOM документе, но быстродействие … При 10 000 записей 69 секунд , а для 100 000 обработка длилась более часа, так и не завершилась, после чего была снята принудительно.

 

Очевидно метод с использованием DOM, в особенности при поиске узлов документа XPath выражениями, надо использовать только для небольших изменений DOM документа со сложной структурой узлов.

 

 

Все последующие методы используют для разбора XML документа фабрику XDTO.

 

Четвертый метод использует метод  ПрочитатьXML глобальной ФабрикиXDTO. При этом тип получаемого объекта не указывается, его определяет сам метод фабрики. Тут есть маленькая тонкость – в случае, если тип получаемого объектаXDTO не указан, фабрика не всегда может самостоятельно определить что она получила одиночный объект или список из нескольких одинаковых объектов ( в нашем примере если ПриходныйОрдер в XML документе будет один фабрика посчитает что ПриходыXDTO.ПриходныйОрдер это одиночный объект а не список).



 

Данный метод не только заметно проще, чем все предыдущие, но и показывает отличное быстродействие  на 10 000 записях 4,6 секунды, а при 100 000 обработка длится 46 секунд. Что показывает линейную зависимость от объема обрабатываемого файла.

 

Пятый метод схож с предыдущим, но глобальной фабрике XDTO подается на вход не только сам XML документ, но и его тип. Этот тип берется из ветки конфигурации XDTO-пакеты. (Если те кто передает вам XML данные хорошие люди, то они должны передать вам и XML схему данных – файл с расширением .xsd  из которого вы и создаете в своей конфигурации  XDTO-пакет – команда импорт XML схемы …, если нет требуемый пакет обычно не сложно создать вручную, анализируя переданные XML данные).

 

Один нюанс – частенько XML данные передают без указания URI пространства имен ( атрибут  xmlns). Если это так, то необходимо самому добавить недостающий атрибут в XML данные, что и делают первые три оператора процедуры.

 

Метод замечательный, как по простоте создания, так и по быстродействию – 3,1 секунды на 10 000 записях.

 

И последний метод. Это скорее некоторая модификация пятого метода, но для условия, что не используется объект конфигурации XDTO-пакет, и фабрика XDTO создается на ходу из текстового описания XML схемы. (Примечание 1-Конечно можно загнать схему в текстовый макет, и оттуда уже использовать, но для учебной программы так нагляднее. 2-Текстовый вариант XML схемы можно например  получить создав XDTO-пакет в любой конфигурации XDTO-пакет и  выполнив команду Экспорт XML схемы..)


В прилагаемой конфигурации все методы разбора XML представлены в общей команде РазобратьXML, там же в другой общей команде СоздатьXML представлены средства для создания тестовых данных.

553

Скачать файлы

Наименование Файл Версия Размер
РазборXML.cf
.cf 18,49Kb
05.11.14
563
.cf 18,49Kb 563 Скачать

См. также

Вознаграждение за ответ
Показать полностью
Комментарии
Избранное Подписка Сортировка: Древо
1. caponid 05.11.14 16:20 Сейчас в теме
Поправь картинку для XPath - слетела
2. ksvd 05.11.14 16:52 Сейчас в теме
Ну заодно и первую, а то она 8 раз повторилась
3. salexdv 1539 05.11.14 18:14 Сейчас в теме
Приходится часто обрабатывать файл известной структуры размером от 300 Мб до 1.5 Гб. Для быстрого чтения использую простую схему.
1. Из файла выделяются блоки (у меня называются "offer"), которых может быть до нескольких сотен тысяч. Делается это через чтение текста с разделителем.
// Чтение файла по блокам <offer>...</offer>
Файл = Новый ЧтениеТекста(ИмяФайла, , "</offer>");	
ТекСтрока = Файл.ПрочитатьСтроку();
Пока ТекСтрока <> Неопределено Цикл
     // Обработка блока
    ТекСтрока = Файл.ПрочитатьСтроку();


2. Каждый блок разбирается с помощью регуляного выражения <ИмяСвойства>(.*?)</ИмяСвойства>

Последний файл размером 460 Мб, обработал за 2 минуты. Но тут надо учитывать, что обработка включала в себя еще чтение/запись в БД.
Памяти такой метод практически не потребляет, правда плохо подходит для файлов со сложной структурой (большим уровнем вложенности)
mirco; melik.kasumov; tsukanov; for_questions; NN2P; zerg17; yuraer; veiuper; Зеленоград; Valerich; +10 Ответить
12. svenderevsky 564 06.11.14 13:44 Сейчас в теме
(3) salexdv,
Преимущество XML документа, в том что это широко используемый международный стандарт
15. salexdv 1539 06.11.14 15:18 Сейчас в теме
(12) Я знаю что такое XML, какие у него преимущества/недостатки, и как его можно прочитать. Попробуйте без затрат памяти, и быстро, прочитать файл в 1.5 Гб. Я просто привел способ, которым делаю это я. Согласен у него просто масса недостатков, но в некоторых случаях он очень сильно выручает.
31. SeverBaP 5 12.11.14 14:47 Сейчас в теме
(3) salexdv, Да реальная тема, есть более подробный пример как читаешь оферы?
32. svenderevsky 564 12.11.14 15:01 Сейчас в теме
(31) SeverBaP,
А что такое оферы?
33. SeverBaP 5 12.11.14 15:29 Сейчас в теме
(32) svenderevsky, "</offer>" - из YML понятие товарное предложение (товар).
На данный момент написал такое:
	Файл = Новый ЧтениеТекста(ФайлХМЛ,КодировкаТекста.UTF8, "</offer>");    
	ТекСтрока = Файл.ПрочитатьСтроку();
	Пока ТекСтрока <> Неопределено Цикл
		
		ТекСтрока = СокрЛП(Файл.ПрочитатьСтроку());
		ТекСтрока = ТекСтрока + "</offer>";
		Сч = Сч+1;
		ЧтениеХМЛ = Новый ЧтениеXML;
		ПараметрыЧтенияХМЛ = Новый ПараметрыЧтенияXML(,,,,,,,,Истина,Истина);
		ЧтениеХМЛ.УстановитьСтроку(ТекСтрока,ПараметрыЧтенияХМЛ);
		
		ПостроительDOM = Новый ПостроительDOM();
		ДокументDOM = ПостроительDOM.Прочитать(ЧтениеХМЛ);
		ЧтениеХМЛ.Закрыть();
		
		Списокoffer=ДокументDOM.ПолучитьЭлементыПоИмени("offer");
		Для Каждого НоменклатураУзел ИЗ Списокoffer Цикл
                 //Тута делаем все что нужно
              КонецЦикла;
         КонецЦикла;
Показать
belchonokh; +1 Ответить
34. svenderevsky 564 12.11.14 16:33 Сейчас в теме
(33) SeverBaP,
	РезультатРазборки = Новый Массив;
	ТипПриходныйОрдерXDTO = ФабрикаXDTO.Тип("http://localhost/testXML","ПриходныйОрдер");
	
	Пока ЧтениеXML.Прочитать() Цикл
			
		Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "ПриходныйОрдер" Цикл 
			ПриходныйОрдерXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипПриходныйОрдерXDTO);
			ДокументПриходныйОрдер = Новый Структура("Номер,Дата,Поставщик,Состав");
			
			ДокументПриходныйОрдер.Номер = ПриходныйОрдерXDTO.Номер;
			ДокументПриходныйОрдер.Дата = ПриходныйОрдерXDTO.Дата;
			ДокументПриходныйОрдер.Поставщик = ПриходныйОрдерXDTO.Поставщик;
			
			ДокументПриходныйОрдер.Состав = Новый Массив;
			Для Каждого СтрокаСоставаXDTO Из ПриходныйОрдерXDTO.Состав.СтрокаСостава Цикл 
				СтрокаСоставаСтруктура = Новый Структура("Номенклатура,Количество");
				СтрокаСоставаСтруктура.Номенклатура = СтрокаСоставаXDTO.Номенклатура;
				СтрокаСоставаСтруктура.Количество = СтрокаСоставаXDTO.Количество;
				ДокументПриходныйОрдер.Состав.Добавить(СтрокаСоставаСтруктура);
			КонецЦикла;
			
			РезультатРазборки.Добавить(ДокументПриходныйОрдер);
		КонецЦикла;
		
	КонецЦикла;
 
Показать


В принципе то же самое, только позволяет несколько сэкономить память при последовательном чтении XML
35. SeverBaP 5 12.11.14 16:43 Сейчас в теме
(34) svenderevsky, в памяти все нормально но скорость просто жесть.. вот думаю как лучше.
36. svenderevsky 564 12.11.14 18:19 Сейчас в теме
(35) SeverBaP,
Работа с DOM самая тяжелая операция из всех методов разбора XML, явное увеличение быстродействия может дать работа с фабрикой XDTO
37. SeverBaP 5 13.11.14 12:22 Сейчас в теме
(36) svenderevsky, непонятно как допустим используя XDTO вытянуть текст из: <category id="85115" parentId="85354">Платья и сарафаны</category> - "Платья и сарафаны" ведь в объектеXDTO только свойства.
38. svenderevsky 564 13.11.14 18:48 Сейчас в теме
(37) SeverBaP,
В пакете XDTO создайте тип category и добавте к нему три свойства - id,parentId и text (впрочем третье имя может быть любым), для первых двух свойств установите Форма - атрибут, а для третьего Форма - текст. Тогда фабрика XDTO поймет строку вида <category id="85115" parentId="85354">Платья и сарафаны</category>
39. kirillkr 28 21.11.14 10:41 Сейчас в теме
(38) svenderevsky, можно пример? у меня аналогичная ситуация.
40. svenderevsky 564 21.11.14 20:54 Сейчас в теме
(39) kirillkr,
Не совсем, точнее совсем, непонятно пример чего?
41. kirillkr 28 24.11.14 08:58 Сейчас в теме
(40) svenderevsky,
В пакете XDTO создайте тип category и добавте к нему три свойства - id,parentId и text (впрочем третье имя может быть любым), для первых двух свойств установите Форма - атрибут, а для третьего Форма - текст.

Как программно!! (без изменения конфигурации) создать или модифицировать пакет xdto, чтобы можно было прочитать и атрибуты и само содержимое тега?
42. SeverBaP 5 24.11.14 11:46 Сейчас в теме
45. kirillkr 28 25.11.14 08:58 Сейчас в теме
(42) SeverBaP, спасибо, читал, но не помогло.
(43), (44), использовал, но может некорректную схему написал - все равно не видит. Вот мой код,
http://code.kraeg.ru/128, а в аттаче пример файла.

В схеме использовал разные варианты, но ни один не видел текст, который между тегами, но прекрасно видит атрибуты.
Прикрепленные файлы:
Реализация товаров № СД00892653 от 25112014.xml
43. svenderevsky 564 24.11.14 13:04 Сейчас в теме
(41) kirillkr,
В последнем примере статьи фабрика XDTO создается программно из строки. тут и надо указывать требуемые элементы пакета
58. jobkostya1c8 11.10.15 20:41 Сейчас в теме
Прочитав статью про XDTO (не заметил раньше) нашел как минимизировать время на модификацию документа только в корневом теге (№ 3, частично № 4 и № 5 - по методу ЧтениеТекста.Прочитать(размер в байт если нельзя построчно):
Получается следующее при нижеприведенном коде и слегка расширенном тестовом XML:
Начали чтение ХМЛ
Контрагент № 1, Наименование учредители
Контрагент № 2, Наименование Фирма1
Договор № 3, Наименование Основной договор
Контрагент № 5, Наименование Последний без подчиненных договоров!
Прочитали ХМЛ


Код обработки (кол. атрибутов "N" теперь 5 и в последнем тоже нет подчиненных узлов с договорами). Тут сразу тоже вопрос: есть ли методы "по-человечески" проверить наличие подчиненного узла (или просто узла по имени? При такой конструкции мы сваливаемся по ошибке при делении на ноль без каких-либо сообщений.

Процедура ТестXDTO() Экспорт
	Попытка
		ЧтениеТекста = Новый ЧтениеТекста(ПутьЗагрузки, КодировкаТекста.UTF8);
		СтрокаXML = ЧтениеТекста.Прочитать(); // Для проверки технологии XDTO читаем до конца, а не порциями
		СтрокаXML = СтрЗаменить(СтрокаXML, "<ROOT", "<ROOT xmlns=""http://localhost/testXML"" ");
		
		ЧтениеXML = Новый ЧтениеXML;
		// Ниже в УстановитьСтроку(<СтрокаXML>, <Параметры>, <НаборСхемXML>) - ТРИ ПАРАМЕТРА!
		//Набор схем XML, используемых при проверки читаемого документа XML.
		//Если набор схем указан, но не проверен и включена проверка документа XML,
		//то будет выполнена проверка набора схем. 
		ЧтениеXML.УстановитьСтроку(СтрокаXML); //<НаборСхемXML> - Вопрос заодно про третий параметр и его смысл, т.к. в статье описан другой прием
		
		РезультатРазборки = Новый Массив;
		ЧтениеXMLСхемы = Новый ЧтениеXML;
		Макет = ПолучитьМакет("схемаXSD");
		СтрокаXSD = Макет.ПолучитьТекст(); // Макет текстовый!
		ЧтениеXMLСхемы.УстановитьСтроку(СтрокаXSD);
		ПостроительDOM = Новый ПостроительDOM;
		ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXMLСхемы);
		ПостроительСхемXML = Новый ПостроительСхемXML;
		СхемаXML = ПостроительСхемXML.СоздатьСхемуXML(ДокументDOM);
		НаборСхемXML = Новый НаборСхемXML;
		НаборСхемXML.Добавить(СхемаXML);
		
		СвояФабрикаXDTO = Новый ФабрикаXDTO(НаборСхемXML);
		ТипКореньXDTO = СвояФабрикаXDTO.Тип("http://localhost/testXML",    "ROOT");
		
		КореньXDTO = СвояФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипКореньXDTO);
		//
		Сообщить("Начали чтение ХМЛ");
		Узлы = КореньXDTO.KON;
		Для каждого Узел из Узлы Цикл
			Сообщить("Контрагент № "+Узел.N+", Наименование "+Узел.Наименование); // Обработка контрагента как структуры
			Попытка
				Узлы = Узел.DOG;
				Для Каждого Узел из Узлы Цикл
					Сообщить(""+Символы.Таб+"Договор № "+Узел.N+", Наименование "+Узел.Наименование); // Обработка всех договоров (если есть) контрагента как подчиненных узлов
					F = 1/0; // Модель ошибки!
				КонецЦикла;	   
			Исключение
				А=1; // Нет узла! Пропускаем!
			КонецПопытки;
		КонецЦикла;	
		Сообщить("Прочитали ХМЛ");		
	Исключение
		Инф = ИнформацияОбОшибке();
		Сообщить(ПодробноеПредставлениеОшибки(Инф) );
	КонецПопытки;
	
КонецПроцедуры	
Показать


Позже приходит на ум "заплатка":
Попытка	
				Узлы = Узел.DOG;
			Исключение
				Продолжить; // Нет узла! Пропускаем!
			КонецПопытки;

Тестовая ошибка будет диагностирована правильно (например тег/атрибут отсутствует).
Начали чтение ХМЛ
Контрагент № 1, Наименование учредители
Договор № 1, Наименование учредители
{ВнешняяОбработка.тестТехнологииЧтенияXMLЧерезXDTO.МодульОбъекта(43)}: Деление на 0
F = 1/0; // Модель ошибки!


Кстати, получается не вижу разницы - объектXDTO можно передавать в процедуры дальше как структуру - тоже большой плюс.
Осталось только запись откатать :) Исправленную версию обработки с файлов XML прилагаю (схема не менялась).
Прикрепленные файлы:
in.xml
тестТехнологииЧтенияXMLЧерезXDTO.epf
44. stas4tor 24.11.14 14:25 Сейчас в теме
(41) kirillkr, А что Вам мешает сделать как показано в последнем примере из статьи? То есть "Программно!!" создать пакет.. Позволю себе процитировать автора:"фабрика XDTO создается на ходу из текстового описания XML схемы". Должно решит вашу проблему кмк.
68. Westbound 20.09.17 10:56 Сейчас в теме
(41) Получаешь последовательность, а потом текст:
Последовательность = ТвойОбъектXDTO_СТекстом.Последовательность();
Текст = Последовательность.ПолучитьТекст(0);
57. jobkostya1c8 11.10.15 12:47 Сейчас в теме
В рамках данной темы по чтению XML посредством фабрики XDTO и xsd схем решил создать тестовый пример in.xml, сгенерировать вышеприведенной утилитой xsd.exe (еще вопрос по ее возможностям и есть ли что-то получше) тестовую схему, дальше загнать ее в макет тестовой обработки и попытаться проверить методы чтения, но не тут то было. Валится с ошибками.
Вопросы:
1. Что не так (может отдельными методами нужно по чтению ХМЛ)? Или еще как-то?
2. Почему все-таки схема xsd не грузится в конфигуратор? Статьи по фабрике и схемам читал, но там не все понятно. Метод интересен, т.к. быстрота чтения и также фабрику XDTO использует перспективная технология веб-сервисов и прочие.
3. Можно ли как-то читать с сохранением быстроты методики фабрики XDTO файлы большого размера без преобразования их заголовков методами СтрЗаменить для добавления в тег http:\\<Что-то непонятное с locajhost> и также смысл этих адресов-имен? На редактирование же требуется время, а на передающей стороне из-за таких конструкций очень сильно возрастает размер файла?
4. Можно ли как читать все это дело (по контрагенту все его договора) как при последовательном чтении.
5. Не проверял еще, но не будет ли при такой технологии переполняться ОЗУ на очень-очень больших файлах (1-2 Гб) - Хоть тут и последовательное чтение методом ЧтениеТекста "за раз" (я про ДокументDOM)?
Вот сообщение об ошибке:
ТестСтрока Контрагенты: N=1, учредители
ТестСтрока Контрагенты: N=2, Фирма1
{ВнешняяОбработка.тестТехнологииЧтенияXMLЧерезXDTO.МодульОбъекта(38)}: Ошибка при вызове метода контекста (ПрочитатьXML)
ДоговорыXDTO = СвояФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипДоговорXDTO); // НА ЭТОЙ СТРОКЕ ОШИБКА!!!
по причине:
Ошибка при вызове метода объекта модели XDTO.
Неверный параметр.

Ниже код обработки:
Процедура ТестXDTO() Экспорт
	Попытка
		ЧтениеТекста = Новый ЧтениеТекста(ПутьЗагрузки, КодировкаТекста.UTF8);
		СтрокаXML = ЧтениеТекста.Прочитать(); // Для проверки технологии XDTO читаем до конца, а не порциями
		СтрокаXML = СтрЗаменить(СтрокаXML, "<KON", "<KON xmlns=""http://localhost/testXML"" ");
		СтрокаXML = СтрЗаменить(СтрокаXML, "<DOG", "<DOG xmlns=""http://localhost/testXML"" ");
		
		ЧтениеXML = Новый ЧтениеXML;
		// Ниже в УстановитьСтроку(<СтрокаXML>, <Параметры>, <НаборСхемXML>) - ТРИ ПАРАМЕТРА!
		//Набор схем XML, используемых при проверки читаемого документа XML.
		//Если набор схем указан, но не проверен и включена проверка документа XML,
		//то будет выполнена проверка набора схем. 
		ЧтениеXML.УстановитьСтроку(СтрокаXML); //<НаборСхемXML> - Вопрос заодно про третий параметр и его смысл, т.к. в статье описан другой прием
		
		РезультатРазборки = Новый Массив;
		ЧтениеXMLСхемы = Новый ЧтениеXML;
		Макет = ПолучитьМакет("схемаXSD");
		СтрокаXSD = Макет.ПолучитьТекст(); // Макет текстовый!
		ЧтениеXMLСхемы.УстановитьСтроку(СтрокаXSD);
		ПостроительDOM = Новый ПостроительDOM;
		ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXMLСхемы);
		ПостроительСхемXML = Новый ПостроительСхемXML;
		СхемаXML = ПостроительСхемXML.СоздатьСхемуXML(ДокументDOM);
		НаборСхемXML = Новый НаборСхемXML;
		НаборСхемXML.Добавить(СхемаXML);
		
		СвояФабрикаXDTO = Новый ФабрикаXDTO(НаборСхемXML);
		ТипКонтаргентXDTO = СвояФабрикаXDTO.Тип("http://localhost/testXML",    "KON");
		ТипДоговорXDTO    = СвояФабрикаXDTO.Тип("http://localhost/testXML", "DOG");
		
		КонтрагентыXDTO = СвояФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипКонтаргентXDTO);
				
		Для каждого ТестСтрока Из КонтрагентыXDTO.KON Цикл
			Сообщить("ТестСтрока Контрагенты: N="+ТестСтрока.N+", "+ТестСтрока.Наименование);// Тест чтения - проверка механизма - дальше более-меннее понятно.
		КонецЦикла;
		
		// Вопрос: Как быть дальше если нужно последовательно читать внутри одного контрагента все договоры (как в последовательном переборе)?
		ДоговорыXDTO    = СвояФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипДоговорXDTO); // НА ЭТОЙ СТРОКЕ ОШИБКА!!!
		Для каждого ТестСтрока Из ДоговорыXDTO.DOG Цикл
			Сообщить("ТестСтрока договоры N "+ТестСтрока.N);// Тест чтения - проверка механизма - дальше более-меннее понятно.
		КонецЦикла;

	Исключение
		Инф = ИнформацияОбОшибке();
		Сообщить(ПодробноеПредставлениеОшибки(Инф) );
	КонецПопытки;
	
КонецПроцедуры	
Показать

Платформа 8.3.6.2041 режим исполнения: толстый клиент, конфигурация нетиповая 1С:Весовой терминал (почти с нуля написана).
Буду раз любой консультации кто сталкивался с подобными трудностями внедрения новой технологии. Тут важно понять смысл стоит ли использовать по быстроте и простоте и когда лучше "по-старому" :)
Прикрепленные файлы:
in.xml
in.xsd
тестТехнологииЧтенияXMLЧерезXDTO.epf
xsd.exe
eeeio; Talim; +2 Ответить
4. Yashazz 2300 05.11.14 20:34 Сейчас в теме
Не вижу итогов производительности по последнему методу (который с прямым указанием xsd).

А вообще - спасибо. У меня всё руки не доходили померять, в результате исходил из пристрелки "на глазок". Рад, что ваши наблюдения подтвердили мои приблизительные замеры.

Эх, ещё бы посмотреть, что больше съедается, куда кэшируется...
18. svenderevsky 564 07.11.14 08:58 Сейчас в теме
(4) Yashazz,
Быстродействие практически такое же как и при использовании ФабрикиXDTO и ПакетаXDTO
5. Armando 1387 05.11.14 21:17 Сейчас в теме
Позволю себе процитировать ИТС. В контексте этой статьи полезно будет.

ИТС: Оптимизация использования оперативной памяти:
Недопустимо работать с большими XML документами с помощью объектов встроенного языка, предназначенных для обработки файлов целиком: текстовые документы в ТекстовыйДокумент, XML в ДокументDOM и HTML в ДокументHTML, а также создавать в памяти XDTO-пакеты размером с весь XML-файл целиком.

В противном случае, весь файл загружается в оперативную память целиком. Исключения составляют отдельные случаи, когда необходим произвольный доступ к содержимому файла, к какой-то конкретной его части.

Следует использовать объекты для последовательной записи и последовательного чтения: ЧтениеXML, ЧтениеТекста, ЗаписьXML, ЗаписьТекста, с помощью которых можно прочитать файл порциями и расходовать память экономно.

При использовании механизмов XDTO неправильно зачитывать в память весь XML-файл целиком (ФабрикаXTDO.ПрочитатьXML(ЧтениеXML)). Вместо этого следует зачитывать XML-файл последовательно, с помощью объекта ЧтениеXML, а его отдельные фрагменты (теги) десериализовывать с помощью фабрики XDTO.
1v7; user828703; CyberCerber; rayastar; for_questions; zzz14; echo77; NN2P; veiuper; alevnev; infostart user; jobkostya1c8; Resha; alexscamp; bashirov.rs; mgn; FrLenok; help1Ckr; thevist; AfroditaS; Silenser; mr.Samuelson; logarifm; Klash; dj_serega; nsirotkin@mail.ru; kirillkr; awk; rtnm; +29 Ответить
14. svenderevsky 564 06.11.14 13:54 Сейчас в теме
(5) Armando,
Если подавать на вход фабрики XDTO не весь документ, а частями (в тестовом примере каждый ПриходныйОрдер отдельно), то несколько снижается быстродействие - при 100 000 записях с 31 сек до 35. В программировании всегда так - экономим память - ухудшаем быстродействие и наоборот. Экономия памяти не самоцель. Обрабатывать как единое целое или по частям XML документ стоит выбирать для каждого конкретного случая
19. dj_serega 358 07.11.14 09:04 Сейчас в теме
Всегда использую XDTO. Если правильно продумать логику то и кодить не нужно если новый объект добавился.
Для этого я использую ОбщийМакет.

Что хотел сказать XDTO рулит :)
Собственно в (5) этому подтверждение :)
6. husky 6 05.11.14 22:09 Сейчас в теме
Подскажите методику, есть HTML страница, есть ли возможность к ней применить вышеизложенные методы, если да, то как?
7. Поручик 4160 06.11.14 08:43 Сейчас в теме
(6) HTML-страницы нормально можно парсить только через DOM-модель.
		ЧтениеHTML = Новый ЧтениеHTML;
		ЧтениеHTML.УстановитьСтроку(СтрокаHTML);
		ПостроительDOM = Новый ПостроительDOM;
		ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);

Они, как правило, относительно небольшого размера, поэтому быстродействие приемлемое. Я сейчас делаю один проект и в нём как раз есть получение страниц с сайта и их разбор. В цикле дёргаются и разбираются порядка ста страниц.
NN2P; rayastar; jobkostya1c8; Spacer; Rustig; +5 Ответить
8. husky 6 06.11.14 10:42 Сейчас в теме
(7) Поручик, этот механизм понятен, сам им пользуюсь, а если альтернативные варианты, может xpath можно использовать или еще как?
9. Yashazz 2300 06.11.14 11:24 Сейчас в теме
(8) husky, я вот использую в своих парсерах именно XPath.