В рамках данной темы по
чтению 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С:Весовой терминал (почти с нуля написана).
Буду раз любой консультации кто сталкивался с подобными трудностями внедрения новой технологии. Тут важно понять смысл стоит ли использовать по быстроте и простоте и когда лучше "по-старому" :)