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