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