|   |   | 
| 
 | Чтение XML. Как определить типы узлов и атрибутов не в коде, а где то еще? XDTO? | ☑ | ||
|---|---|---|---|---|
| 0
    
        Crush 27.08.14✎ 11:49 | 
        Пришел ко мне очередной xml файл какого то формата. Хочу прочитать.
 Писать код типа "КореньДОМ.ПолучитьЭлементыПоИмени(" уже надоело. Хочется где то отдельно описать структруктуру xml файла и обращаться к узлам как объектам. Пока начал курить XDTO, но не уверен что двигаюсь в правильном направлении. Подопните пожалуйста. Задайте вектор. В xdto меня смущает такая конструкция ФабрикаXDTO.Тип("http://www.1c.ru/demos/products", "Номенклатура"), т.е. описание типа должно лежать на web-ресурсе. А как то в дереве метаданых можно описать структуру и типы и сказать что Этот файл должен читаться вот по Этой структуре? | |||
| 1
    
        Господин ПЖ 27.08.14✎ 11:52 | 
        >т.е. описание типа должно лежать на web-ресурсе.
 щито? | |||
| 2
    
        Crush 27.08.14✎ 11:54 | 
        (1) В примерах везде такая конструкция дробныйТип = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "decimal");
 http://www.w3.org/2001/XMLSchema - это вот локально можно изобразить? Пока такого примера не нашел | |||
| 3
    
        Господин ПЖ 27.08.14✎ 11:57 | 
        (2) что значит локально?
 это просто обозначение пространства имен. | |||
| 4
    
        Господин ПЖ 27.08.14✎ 11:58 | ||||
| 5
    
        Поpyчик-4 27.08.14✎ 11:58 | 
        (2) Ссылки в описаниях типа чисто формальные и описывают пространство имён.     | |||
| 6
    
        viacheslav 27.08.14✎ 12:01 | 
        XDTO для ваших целей самое оно, мне кажется
 вот цикл из 3 статей, где доступно изложено про XDTO http://infostart.ru/public/167459/ И в частности, ответ из этой статьи на ваш вопрос про пространства имен: По традиции (и по многим другим соображениям), пространства именуются в виде URL-подобных строк. Например, “http://vasya.org/xml/sotrudniki”. Причем, это не ссылка в сети, это просто строка-идентификатор. Документы пестрят этими “ссылками” и ,сталкиваясь с ними, начинающий специалист впадает в ступор - “что это за адреса, что по ним расположено, а что, если нет интернета...” Так вот, это не адреса, это уникальные идентификаторы пространств имен. Строка может быть любой. | |||
| 7
    
        Господин ПЖ 27.08.14✎ 12:03 | 
        >Ссылки в описаниях типа чисто формальные
 не совсем. ссылка говорит что это "стандартный" decimal. По "ГОСТу"... любой крендель может зайти на w3.org и может ознакомиться. будет "нести отсебятину" в коде ссылаясь на это пространство - проблемы буратины | |||
| 8
    
        Crush 27.08.14✎ 12:05 | 
        (5) (4) Спасибо (6) за вектор!;) Ушел курить     | |||
| 9
    
        Зойч 27.08.14✎ 12:08 | 
        ЧтениеXML = Новый ЧтениеXML;
 ЧтениеXML.ОткрытьФайл(ИмяФайла); ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML); ЧтениеXML.Закрыть(); | |||
| 10
    
        Господин ПЖ 27.08.14✎ 12:09 | 
        (9) а что он прочитает без схемы?
 опять же чем проверять адекватность файла | |||
| 11
    
        Зойч 27.08.14✎ 12:11 | 
        (10) схему на лету сам составит )))     | |||
| 12
    
        Crush 27.08.14✎ 12:29 | 
        (9) 
 Открыл в отладчике ОбъектXDTO - Вот это круто!!! Осталось только типы задать, а то все примитивные типы - строки. А тип СписокXDTO можно конвертировать в таблицу значений средствами xdto или только кодом тз заполнять? | |||
| 13
    
        Timon1405 27.08.14✎ 12:43 | 
        посмотрите БСП  - модуль КонтактнаяИнформацияСлужебный, там есть десериализация, может быть будет полезно     | |||
| 14
    
        Crush 27.08.14✎ 14:25 | 
        Что то не курицца никак. В схеме определил числовой тип, а на выходе всё равно строка.
 СхемаXML = Новый СхемаXML; СхемаXML.РасположениеСхемы = "test.xsd"; СхемыXML = Новый НаборСхемXML; СхемыXML.Добавить(СхемаXML); ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.ОткрытьФайл("test.xml"); Фабрика = Новый ФабрикаXDTO(СхемыXML); Данные = Фабрика.ПрочитатьXML(ЧтениеXML); Если ТипЗнч(Данные.Число)=Тип("Строка") Тогда Сообщить("Косяк"); КонецЕсли; test.xsd: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Корень"> <xs:complexType> <xs:sequence> <xs:element name="Число" type="xs:decimal" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> test.xml: <?xml version="1.0" encoding="utf-8"?><Корень Число="34,55">блаблабла</Корень> | |||
| 15
    
        Господин ПЖ 27.08.14✎ 14:38 | 
        ЧтениеXML.ОткрытьФайл
 покурить параметры | |||
| 16
    
        Crush 27.08.14✎ 16:17 | 
        (15) Не смог 
 (5) Ссылки нифига не формальные, а очень даже с индивидуальными назначениями. Был удивлен получив тип своего справочника ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "CatalogObject.Номенклатура") Причем если поменять пространство имен, то результат пропадает. Нашел такое же имя в ФабрикаXDTO.Пакеты, коих там много. А где может быть описание их назначений? Я так понимаю, что добавив общий XDTO-пакет Фабрика будет о нем знать и сможет использовать. | |||
| 17
    
        Crush 27.08.14✎ 16:17 | 
        + (16) А где может быть описание их назначений? Сам нашел:) http://infostart.ru/public/258947/     | |||
| 18
    
        Crush 27.08.14✎ 16:21 | 
        Голова что то пухнет.
 Может кто подскажет как имея файл <?xml version="1.0" encoding="utf-8"?><Корень Число="34,55">блаблабла</Корень> Прочитать его через фабрику и число приобрело бы числовой тип? Число(СтрЗаменить(Данные.Число,",",".")) - не предлагать | |||
| 19
    
        Господин ПЖ 27.08.14✎ 16:50 | 
        (18) про буратину я уже писал...
 где тут ","? http://www.w3schools.com/schema/schema_dtypes_numeric.asp | |||
| 20
    
        Господин ПЖ 27.08.14✎ 16:50 | 
        схемы создаются чтобы их соблюдать (с) ко     | |||
| 21
    
        Crush 27.08.14✎ 17:43 | 
        (19) Спасибо! Полезная ссылочка ушла в закладки.
 Поменял на точку - не помогло. Изменил наименования узла и атрибута на латинские - не помогло (в схеме тоже поменял). СхемаXML = Новый СхемаXML; СхемаXML.РасположениеСхемы = "test2.xsd"; СхемыXML = Новый НаборСхемXML; СхемыXML.Добавить(СхемаXML); ЧтениеXML = Новый ЧтениеXML(); ПараметрыЧтения = Новый ПараметрыЧтенияXML("1.0"); ЧтениеXML.ОткрытьФайл("test2.xml",ПараметрыЧтения,СхемыXML,"UTF-8"); Фабрика = Новый ФабрикаXDTO(СхемыXML); qqq = Фабрика.ПрочитатьXML(ЧтениеXML); Если ТипЗнч(qqq.www)=Тип("Строка") Тогда Сообщить("Косяк"); КонецЕсли; | |||
| 22
    
        Crush 27.08.14✎ 17:47 | 
        Мне вот странно. В примере используется текстовое поле узла
 <prize>999.50</prize> А я использую значение атрибута узла. Причем текстовое поле со значением "блаблабла" игнорируется (скорее от того, что не прописано в схеме) Может для атрибутов есть какие то другие способы определения типа значения? | |||
| 23
    
        Serginio1 27.08.14✎ 18:17 | 
        А не проще
 Фабрика =СоздатьФабрикуXDTO(ИмяФайлаСхемыXSD) | |||
| 24
    
        mistеr 27.08.14✎ 18:27 | 
        (23) У него схемы нет.     | |||
| 25
    
        Crush 27.08.14✎ 18:30 | 
        (23) Не сработало 
 (24) Ну как же нет. А это что: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Корень"> <xs:complexType> <xs:sequence> <xs:element name="Число" type="xs:decimal" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> | |||
| 26
    
        Crush 27.08.14✎ 18:31 | 
        Точнее сейчас это так выглядит (убрал кирилицу)
 <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="qqq"> <xs:complexType> <xs:sequence> <xs:element name="www" type="xs:decimal" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> | |||
| 27
    
        Crush 27.08.14✎ 18:32 | 
        XML такой
 <?xml version="1.0" encoding="utf-8"?><qqq www="34.55">блаблабла</qqq> | |||
| 28
    
        Зойч 27.08.14✎ 18:32 | 
        как схему создавал?     | |||
| 29
    
        Crush 27.08.14✎ 18:34 | 
        (28) Через какой то онлайн сервис прогнал xml и получил xsd
 http://www.flame-ware.com/products/xml-2-xsd/ | |||
| 30
    
        Дык ё 27.08.14✎ 18:34 | 
        (27) забей на схему, конверти anyType на лету :)
 www = ФабрикаXDTO.Привести(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "decimal"), qqq.ПолучитьXDTO("www")).Значение; | |||
| 31
    
        Зойч 27.08.14✎ 18:37 | 
        <?xml version="1.0"?>
 <!-- Generated using Flame-Ware Solutions XML-2-XSD v2.0 at http://www.flame-ware.com/Products/XML-2-XSD/ --> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="qqq" nillable="true"> <xs:complexType> <xs:simpleContent msdata:ColumnName="qqq_Text" msdata:Ordinal="1"> <xs:extension base="xs:string"> <xs:attribute name="www" type="xs:string" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="qqq" /> </xs:choice> </xs:complexType> </xs:element> </xs:schema> | |||
| 32
    
        Serginio1 27.08.14✎ 18:39 | 
        ЧтениеXML.ОткрытьФайл(ИмяФайла);
 ЧтениеXML.ПерейтиКСодержимому(); ОбъектXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя)); | |||
| 33
    
        Crush 27.08.14✎ 18:40 | 
        (31) Да. Убрал из неё всё лишнее (на свой взгляд).
 Сейчас с такой же пробовал (заменил string на decimal) <xs:attribute name="www" type="xs:decimal" /> Всё равно не взлетает. | |||
| 34
    
        Crush 27.08.14✎ 18:43 | 
        (32) тоже не взлетает
 ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя - эти свойства пустые. Так и должно быть? | |||
| 35
    
        Crush 27.08.14✎ 18:45 | 
        (30) Некрасиво как то. Будет таблица из 20 колонок и 10000 строк. Каждое значение приводить к типу накладно будет.     | |||
| 36
    
        Serginio1 28.08.14✎ 10:40 | 
        (34) Нет. Для начала запиши объект в файл и посмотри как он будет выглядеть.     | |||
| 37
    
        Serginio1 28.08.14✎ 11:59 | 
        Вообще при записи лучше придерживаться такой схемы
 ЗаписьXML=Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(Файл); ЗаписьXML.ЗаписатьОбъявлениеXML(); ЗаписьXML.ЗаписатьНачалоЭлемента(XMLСтрока("Данные")); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("", ИмяОсновногоПространстваИмен ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema"); ..... ЗаписьXML.ЗаписатьКонецЭлемента(); ЗаписьXML.Закрыть(); При чтении ЧтениеXML=Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайла); ЧтениеXML.ПерейтиКСодержимому(); ЧтениеXML.Прочитать(); // Пропустим Данные Пока ЧтениеXML.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл ОбъектXDTO=Фабрика.ПрочитатьXML(ЧтениеXML,Фабрика.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя)); КонецЦикла | |||
| 38
    
        Crush 28.08.14✎ 18:29 | 
        Ну наконец то дело сдвинулось с мёртвой точки.
 Для начинающих хороший пример работы с XDTO в 22 комментарии статьи http://infostart.ru/public/167459/ | |||
| 39
    
        Господин ПЖ 28.08.14✎ 18:39 | 
        >Ну наконец то дело сдвинулось с мёртвой точки. 
 победил что ли | |||
| 40
    
        Crush 28.08.14✎ 22:49 | 
        (39) Нет. Только чуть-чуть сдвинулся с мертвой точки и... похоче умом тоже двигаюсь потихоньку.
 Читать и писать научился. Но почему когда я явно в схеме указываю, что это decimal у меня в объектеХДТО всё равно строка? Если использовать метод ПРИВЕСТИ, то получаю ЧИСЛО. Неужели ко всем свойствам индивидуально нужно применять метод ПРИВЕСТИ? Мне как то кажется, что если я в схеме указал тип атрибута, то все значения этого атрибута должны как то сами соответствовать типу. | |||
| 41
    
        Torquader 29.08.14✎ 00:41 | 
        Ну если уж очень хочется читать по узлам, то xml можно читать как текстовый файл, тогда прочитать можно всё - даже неправильный xml, но вопрос в том - зачем это нужно.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |