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