|   |   | 
| 
 | Проверка 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     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |