Имя: Пароль:
1C
 
Проверка XML на соответствие схеме
0 vi0
 
08.02.15
20:13
Добрый день

Есть XML-данные которые нужно проверить и загрузить в 1с8.
Структура XML здесь содержит два уровня: корневой элемент как обязательный, и элементы в которых передаются документы: накладные итп (фактически уровней больше, но здесь не принципиально).
Создан xdto-пакет в котором есть тип для каждого загружаемого документа.

ВОПРОС: Как проверить эти документы - элементы второго уровня на сооветствие схеме?
При такой структуре, как я понимаю я должен считывать поочередно элементы и создавать ОбъектXDTO, при этом платформа выполнит проверку.
Проверка не выполняется т.к. в методе ПрочитатьXML я не задал тип. Но как я узнаю тип если там могут быть разные документы? И правильно ли мне самому определять тип?

ЧтениеXML.Прочитать();
Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента Цикл
     Объект1 = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
КонецЦикла;

Для решение вопроса я могу в xdto-пакете создать некий искуственный корневой тип, в нем сделать списки документов и считывать весь xml одним вызовом (придется и структуру xml привести к этому формату).
Но правильна ли такая искуственность? И это чревато неоправданным расходом ресурсов при больших объёмах, как я понимаю.
Объект1 = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип(ПространствоИмен1, "Корень1"))
1 vi0
 
09.02.15
09:17
подниму
2 vi0
 
09.02.15
14:04
ответ найден в документообороте
действительно можно последовательно читать и проверять элементы, получая тип из имени элемента
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла);
ЧтениеXML.Прочитать();
Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
    ТипXDTO = ФабрикаXDTO.Тип("http://www.1c.ru/mobileDM";, ЧтениеXML.Имя);
    ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипXDTO);
3 vi0
 
16.02.15
13:47
в топике я писал, что для решение вопроса я могу в xdto-пакете создать некий искусственный корневой тип, в нем сделать списки документов и считывать весь xml одним вызовом (придется и структуру xml привести к этому формату).

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

вот так я могу сделать, но проверка при этом не выполняется:
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Строка1);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

какой тип нужно указать вторым параметром в ПрочитатьXML(), чтобы выполнилась проверка?
4 vi0
 
16.02.15
14:01
имею ввиду создать один ОбъектXDTO для всего xml-файла
5 Goggy
 
16.02.15
14:16
Прикольный монолог :)
6 DrZombi
 
гуру
16.02.15
14:41
(0) А зачем тебе проверять, когда как ни крути, ты это загрузишь :)
7 vi0
 
16.02.15
14:56
(6) если проверку не пройдет то загружать не буду
например в xml не будет обязательного элемента с уникальным идентификатором
8 Serginio1
 
16.02.15
15:22
(3)
ОбъектXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));
9 vi0
 
16.02.15
15:28
(8) Это можно использовать при переборе элементов объектом ЧтениеXML
В (2) именно такой способ привел

вопрос как прочитать весь xml с плоской структурой одним чтением ФабрикаXDTO.ПрочитатьXML, когда в xml на одном уровне хранятся элементы разного типа (например данные документов)
10 Serginio1
 
16.02.15
15:28
Или ОбъектXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ПолучитьXMLТип(ЧтениеXML)
11 Serginio1
 
16.02.15
15:29
Прочитай последовательно. В чем проблемы?
12 vi0
 
16.02.15
15:35
(11) рассматриваю способ загрузки xml, когда нужно один раз загрузить его в ОбъектXdto и дальше неоднократно получать из него данные, перебирать/искать несколько раз, при необходимости
13 Serginio1
 
16.02.15
15:37
(12) Сериализуй в список или в массив и прочитаешь все за один раз. Только это хорошо когда объектов мало.
14 vi0
 
16.02.15
15:42
(13) "Сериализуй в список" - на этапе выгрузки?
т.е. здесь не избежать изменения структуры xml,
15 vi0
 
16.02.15
15:42
?
16 Serginio1
 
16.02.15
16:58
Обычно при выгрузке в XML записывают внутри элемента
ЗаписьXML=Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(Файл);
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    
    ЗаписьXML.ЗаписатьНачалоЭлемента(XMLСтрока("Данные"));
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("", "http://v8.1c.ru/8.1/data/enterprise/current-config";);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance";);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema";);


Можно создать массив объектов и сериализовать его в XML
и прочитать его полностью

http://88.198.55.240/topic.php?id=665719#19
17 vi0
 
16.02.15
17:20
(16) > Обычно при выгрузке в XML записывают внутри элемента
> ЗаписьXML.ЗаписатьНачалоЭлемента(XMLСтрока("Данные"));
я бы даже сказал, что так нужно сделать обязательно по стандарту xml и по другому не получится

> Можно создать массив объектов и сериализовать его в XML
тогда получается что, чтобы читать одним вызовом и одновременно проверять - нужно делать особую стуктуру xml

вижу еще такой способ: проверку сделать перебором используя ЧтениеXML, или как-то иначе, а потом уже просто читать без проверки:
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Строка1);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
18 Serginio1
 
16.02.15
17:39
19 vi0
 
16.02.15
17:50
(18) не надо делать что?
20 Serginio1
 
16.02.15
18:00
Не надо ничего делать дополнительно с XML  если выгружается один объект. Правда когда этих объектов очень много, они могут отожрать всю память.
21 Serginio1
 
16.02.15
18:01
Кода много объектов в массиве. А массив это один объект
22 vi0
 
16.02.15
18:10
(20) инфа, конечно полезная, но есть условия: xml имеет определенную структуру и выгружается из внешней системы (не v8), и мне нужно решить вопрос с этими условиями
23 vi0
 
16.02.15
18:16
+(20) т.е. особая структура xml как раз нужна, она делается Сериализатором см (18)
24 Serginio1
 
17.02.15
10:44
(23) Я говорил, что самому ничего для этого делать не надо в отличие от 16