|
Чтение из XML | ☑ | ||
---|---|---|---|---|
0
vanderdecken
13.09.15
✎
00:03
|
Добрый день
Имеется xml-файл, в котором записаны итоговые данные по результатам работы оборудования. Есть ли возможность средствами самой платформы прочесть данные из него сразу в структуру, не читая и разбирая каждый из тегов, а, скажем, предварительно описав эти данные через XDTO? |
|||
1
Брегорьян
13.09.15
✎
06:34
|
сразу не выйдет, придётся читать нужные теги
|
|||
2
poligraf
13.09.15
✎
07:27
|
(0) есть ODBC-драйвера для XML.
|
|||
3
Записьдампа
13.09.15
✎
09:07
|
Если опишешь схему xml и разберёшся с пространствами имён, то можно построить фабрику XDTO, при использовании которой при чтении xml получится объект XDTO с типизированными полями.
|
|||
4
Armando
13.09.15
✎
09:59
|
Просто ФабрикаXdto.прочитатьxml не работает чтоли?
|
|||
5
Записьдампа
13.09.15
✎
10:16
|
(4) Годится только для того, чтобы однократно прочитать файл.
1) Не типизирует эначения. 2) Пытается распознать схему по содержимому каждый раз заново, что запросто приводит к отложенному развалу. Например, у тебя в данных есть список, который в один прекрасный момент начинает содержать всего один элемент. В момент чтения схема изменяется и твой код ломается, потому что получает не список, а значение. Аналогично с необязательными полями. |
|||
6
vanderdecken
15.09.15
✎
08:11
|
(4) Рабтает, но все поля имеют тип ОбъектXDTO, а хотелось бы получить структуру, поля которой будут строками, числами
|
|||
7
Записьдампа
15.09.15
✎
08:36
|
(6) Опиши структуру своего XML в пакете XDTO или сделай xsd схему. После этого можно начинать говорить о типизации.
|
|||
8
vanderdecken
15.09.15
✎
09:07
|
(7) Это я сразу сделал..
<xs:schema xmlns:tns="http://www.pg.ru/omsdata" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.pg.ru/omsdata" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xs:element name="OMSDataSet" type="tns:OMSDataSet"/> <xs:complexType name="Consumption"> <xs:sequence> <xs:element name="ConsumptionC1" type="xs:decimal"/> <xs:element name="ConsumptionC2" type="xs:decimal"/> </xs:sequence> </xs:complexType> <xs:complexType name="DataFile"> <xs:sequence> <xs:element name="StartData" type="xs:string"/> <xs:element name="StopData" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="OMSDataSet"> <xs:sequence> <xs:element name="DataFile" type="tns:DataFile"/> <xs:element name="Consumption" type="tns:Consumption"/> </xs:sequence> </xs:complexType> </xs:schema> |
|||
9
vanderdecken
15.09.15
✎
09:08
|
(7) Это результат экспорта моего пакета XDTO в файл
|
|||
10
vanderdecken
15.09.15
✎
11:40
|
(7) А так выглядит файл, который я пытаюсь прочесть:
<?xml version="1.0" standalone="yes"?> <OMSDataSet> <DataFile> <StartData>10/09/2015 08:56:42</StartData> <StopData>10/09/2015 14:27:36</StopData> </DataFile> <Consumption> <ConsumptionC1>8853427</ConsumptionC1> <ConsumptionC2>0</ConsumptionC2> </Consumption> </OMSDataSet> |
|||
11
magicSan
15.09.15
✎
11:48
|
эй запросы же можно делтаь к иксмл!
|
|||
12
vanderdecken
15.09.15
✎
11:52
|
(11) Не слышал про такое :( Где об этом почитать?
|
|||
13
Записьдампа
15.09.15
✎
16:29
|
(10) Укажи в xml пространство имён и читай фабрикой с указанием типа, построенного по пространству имен и имени типа. В результате будет получен ОбъектXDTO с типизированными полями, к которым можно спокойно обращаться через точку.
|
|||
14
Serginio1
15.09.15
✎
18:50
|
(8) Импортируй схему либо создатй фабрику по схеме
Фабрика = СоздатьФабрикуXDTO(ИмяФайла_xsd); |
|||
15
Fragster
гуру
15.09.15
✎
18:53
|
(10) у тебя дата кривая. правильная XML дата выглядит как вывод команды XMLСтрока(ТекущаяДата())
|
|||
16
Fragster
гуру
15.09.15
✎
18:53
|
(15)+ соответственно, переводить двои даты в нормальные надо будет руками. ну, или в том месте, где XML генерится, поправить.
|
|||
17
Записьдампа
15.09.15
✎
18:56
|
(14) Не все так просто =)
1С очень трепетно относится к пространствам имён, надо или явно указывать xmlns в читаемом файле, или колхозить свое чтение xml через DOM или прогонять файл через xslt преобразование. |
|||
18
Serginio1
15.09.15
✎
18:57
|
(15) Унего
<xs:complexType name="DataFile"> <xs:sequence> <xs:element name="StartData" type="xs:string"/> <xs:element name="StopData" type="xs:string"/> </xs:sequence> как строка |
|||
20
Fragster
гуру
15.09.15
✎
19:00
|
(18) потому что схему он генерил генерилкой, которая тоже не поняла, что там типа дата. но судя по данным - там именно дата, с которой он как-то хочет работать.
|
|||
21
Serginio1
15.09.15
✎
19:00
|
(17) Да не прочитает. Вернее прочитает но значения бубут строковыми
|
|||
22
Serginio1
15.09.15
✎
19:01
|
(20) При этом Consumption decimal
|
|||
23
Fragster
гуру
15.09.15
✎
19:03
|
(22) потому что генерилка увидела там числа в XML формате и попыталась предположить, что там должны быть числа. ни разу не видел гернераторов схем по имеющимся файлам? там надо порой всякие ограничения добавлять, либо чтобы сразу файл был максимально хитрый, либо там всякие min- и maxoccurance проставлять, типы подправлять и т.п.
|
|||
24
Записьдампа
15.09.15
✎
19:04
|
(21) см (5) - читать без точного указанмя типа - к развалу кода.
Чойто меня идея с xlst аж заинтересовала, чуть позже попробую зарелизить джастфофан =) |
|||
25
vanderdecken
15.09.15
✎
19:16
|
(17) Т.е. корневой тэг перед чтением надо будет превратить во что-то типа <Tag1 xmlns="xxxxxx">?
(20) Схема выгружена из 1С-ного XDTO-пакета, который я завел в конфе. То, что дата кривая, мне известно, и именно по этой причине, как уже справедливо отмечалось выше, тип этих элементов выставлен мной в string. |
|||
26
Записьдампа
15.09.15
✎
19:26
|
(25) <OMSDataSet xmlns="http://www.pg.ru/omsdata">
И потом ... ТипДанных = Фабрика.Тип("http://www.pg.ru/omsdata", "OMSDataSet"); Данные = Фабрика.Прочитать(ЧтениеXML, ТипДанных)/ |
|||
27
Serginio1
15.09.15
✎
20:10
|
(24) Прочитает как AnyType структура будет та же только значения строеовые
|
|||
28
Serginio1
15.09.15
✎
20:12
|
(23) то что видел делал параметры строковыми. если есть интересные ссылки то буду благодарен.
|
|||
29
vanderdecken
15.09.15
✎
20:25
|
(26) Да, я так и делал, но после выполнения этого кода в Данные все равно ОбъектXDTO, а я робко надеялся получить структуру
|
|||
30
Serginio1
15.09.15
✎
20:28
|
(29) ОбъектXDTO это и есть структура. Ничем не отличается. Смотри отладчиком.
Ты можешь обрашаться так Данные.DataFile.StartData Чем не структура? |
|||
31
vanderdecken
15.09.15
✎
20:39
|
Пытаюсь сериализатор прикрутить, но он ругается, говорит "Отсутствует отображение для типа '{http://www.pirrogroup.ru/omsdata}OMSDataSet'", хотя при описании XDTO-пакета я указал, что базовый тип для него '{http://v8.1c.ru/8.1/data/core}Structure'
|
|||
32
Serginio1
15.09.15
✎
21:06
|
(31) А ты делаешь как в 14 и судя по 8 там никакой {http://v8.1c.ru/8.1/data/core}Structure и не пахнет
|
|||
33
vanderdecken
15.09.15
✎
21:14
|
(32) Я же не сижу и не жду когда мне на форуме напишут рабочий код, я пробую, изменяю..
Сейчас порезал файл и схему до минимума <xs:schema xmlns:ns1="http://v8.1c.ru/8.1/data/core" xmlns:tns="http://www.pg.ru/omsdata" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.pg.ru/omsdata" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xs:import namespace="http://v8.1c.ru/8.1/data/core"/> <xs:element name="OMSDataSet" type="tns:OMSDataSet"/> <xs:complexType name="DataFile"> <xs:complexContent> <xs:extension base="ns1:Structure"> <xs:sequence> <xs:element name="StartData" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="OMSDataSet"> <xs:complexContent> <xs:extension base="ns1:Structure"> <xs:sequence> <xs:element name="DataFile" type="tns:DataFile"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:schema> Как заработает минимум дополнительные поля не сложно вернуть |
|||
34
vanderdecken
15.09.15
✎
21:15
|
(32) Файл теперь выглядит так:
<?xml version="1.0" standalone="yes"?> <OMSDataSet xmlns="http://www.pg.ru/omsdata"> <DataFile> <StartData>10/09/2015 08:56:42</StartData> </DataFile> </OMSDataSet> |
|||
35
Serginio1
15.09.15
✎
21:19
|
А зачем тебе именно структура нужна?
|
|||
36
Serginio1
15.09.15
✎
21:20
|
И какая у тебя задача?
|
|||
37
vanderdecken
15.09.15
✎
21:24
|
(35) Весть код работы с xml со всей его спецификой соберу в одном месте, после чтения с данными можно было работать не оглядываясь на эту специфику.
Задача описана в (0), не из разряда горящих, поэтому хотелось бы сделать максимально красиво и правильно. |
|||
38
Записьдампа
15.09.15
✎
21:35
|
(24) Хе. Структура, на! =)
Функция СтруктураИзФайла(ИмяФайла)
В продакшн не рекомендую, слишком заумно. |
|||
39
Serginio1
15.09.15
✎
21:45
|
(37) В БП3 есть преобразование ОбъектXDTO в структуру
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |