Имя: Пароль:
1C
 
Чтение 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, но вопрос в том - зачем это нужно.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой