|
XDTO. Переносы строк в xml файле. | ☑ | ||
---|---|---|---|---|
0
SuKaS
06.11.18
✎
10:36
|
Добрый день всем.
Создаю xml файл используя пакеты XDTO. Схемы были предоставлены гос. конторой, поэтому XDTO казалось использовать проще... Но не тут то было. Файл сформировался отлично, данные в него загружены, но выявилось 2 беды: 1. Файл, при открытии его в notepad++ не имеет переносов строк. Т.е. он в одну строку. В принципе, при открытии через XML Explorer или Edge проблем никаких и нормально парсится, но на принимающей стороне ругаются. При создании файла через ЗаписьXML такой проблемы нет. 2. Вторая беда в том, что необходимо задать псевдонимы пространства имен (задаются в начале файла), а потом используются в теле документа уже псевдонимы. Например, в корневом каталоге прописаны NS xmlns:УТ="http://url.url/UT/2017-08-21" - здесь УТ есть имя Оно уже используется в самом документе <Реквизиты> <УТ:Дата>2017-03-31</УТ:Дата> <УТ:Номер>654684</УТ:Номер> </Реквизиты> Но в XDTO я не нашел как задать такой параметр. Если что сможет чем помочь, буду благодарен (+97 в карму) |
|||
1
asady
06.11.18
✎
10:41
|
||||
2
DmitrO
06.11.18
✎
10:59
|
В объекте ЗаписьXML настраивается и 1 и 2.
>>Создаю xml файл используя пакеты XDTO Как так формируется xml файл с использованием XDTO, и не используя ЗаписьXML, не понятно. Это даже как-то постараться надо. :) |
|||
3
SuKaS
06.11.18
✎
12:11
|
(1) Так тип не получить. Получить надо тип конкретного объекта пространства имен.
Например: типУТ_ФИО = ФабрикаXDTO.Тип("http://url.url/UT/2017-08-21","УТ", "ТипФИО"); (2) Не совсем правильно выразился. Имеется ввиду, что запись формируется механизмами XDTO и указанными схемами. Без использования методов ЗаписьXML.ЗаписатьНачалоЭлемента ЗаписьXML.ЗаписатьАтрибут и ЗаписьXML.ЗаписатьКонецЭлемента |
|||
4
DmitrO
06.11.18
✎
12:20
|
по пунктам:
1. Смотри в СП объект ПараметрыЗаписиXML отступы настраиваются там и по умолчанию они вроде итак заданы. 2. Смотри метод ЗаписатьСоответствиеПространстваИмен у объекта ЗаписьXML. Все используемые пространства имен можно объявить в корневом элементе. |
|||
5
arsik
гуру
06.11.18
✎
12:29
|
(0) xsd схема то есть у вас? Если ест то, например делаете так:
Фабрика = СоздатьФабрикуXDTO(ПутьКМоемуФайлуСхемы);
|
|||
6
SuKaS
06.11.18
✎
13:47
|
(4) ЗаписатьСоответствиеПространстваИмен используется при использовании ЗаписьXML.ЗаписатьНачалоЭлемента и вызывается после него. Я же не использую ЗаписатьНачалоЭлемента, все элементы записываются автоматически механизмом XDTO.
|
|||
7
SuKaS
06.11.18
✎
13:52
|
(4) ПараметрыЗаписиXML помогли, большое спасибо!
Смутило по началу, что свойства не доступны для записи. Так работает: ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Истина); Так не работает: ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML(); ПараметрыЗаписиXML.Отступ = Истина; |
|||
8
DmitrO
06.11.18
✎
14:02
|
(6)да, а вот чтобы объявить префиксы пространств имен один раз, корневой элемент надо делать ручками (ЗаписатьНачалоЭлемента), потом нахлобучивать префиксы пространств имен, потом уже вдувать в файл объекты XDTO сериализатором или фабрикой, ну и в конце ручками закрыть корневой элемент.
|
|||
9
SuKaS
06.11.18
✎
14:45
|
(8) Большое спасибо, попробую.
Еще вопросик небольшой, может сталкивались. В схеме прописан тип данных "ТипДеньгиКоп". Подразумевается, что формат будет с копейками, т.е. число 5 должно записаться как 5.00. Бился пару дней с этой проблемой, по итогу исправил тип в схеме на строку и пишу строку "5.00". 1С настырно отбрасывает лишние по ее мнению нули. Хотя образец в схеме прописан "\-?[0-9]+\.\d{2}" |
|||
10
SuKaS
06.11.18
✎
15:10
|
(8) Спасибо, это помогло. Правда немного увеличило код. Ранее вся запись в файл была в одну строку - это запись корневого элемента. Теперь немного увеличилось, но вроде работает.
Но теперь не ясно, как сделать запись о пространстве имен без префикса... Т.е. самое первое пространство имен, основное так сказать. |
|||
11
DmitrO
06.11.18
✎
15:16
|
(9)Если у типа задан образец, то базовый тип у него string, а мы туда число пихаем. Объект XDTO не преобразовывает числа к строке по образцу, вместо этого 1С по своему обыкновению просто не явно преобразует число к строке.
Выдерживать образец это задача самого программиста. Т.е. сам форматируй функцией Формат и пихай строку. Это разработчики схемы надурили, им надо было взять базовый тип decimal, и ограничить его как надо. Тогда бы работало с присвоением числа. |
|||
12
DmitrO
06.11.18
✎
15:22
|
(10)пространство имен без префикса это тоже определенное пространство имен и задается так: ЗаписатьСоответствиеПространстваИмен("", "тут uri ПИ").
Имя элемента, в котором объявляется префикс пространства имен, уже может содержать этот префикс. |
|||
13
DmitrO
06.11.18
✎
15:33
|
С точки зрения xml парсеров это два совершенно одинаковых квалифицированных элемента:
<n1:data xmlns:n1="uri_test" /> <data xmlns="uri_test" /> Для них это одно и тоже, читаться и соответствовать схеме будет и то и это. |
|||
14
SuKaS
06.11.18
✎
16:05
|
(12) Да, это я сам допер. С именами. А вот по типам не до конца.
Есть такая структура: <СВ> <Сумма>6975.49</Сумма> <Доход>2480.48</Доход> </СВ> "Сумма" и "Доход" имеют тип "ТипДеньги", который описан в другом пространстве имен как ТипыЗначений. А уже во втором пространстве имен есть описание ТипаЗначений "ТипДеньги" как атомарного типа. И в нем базовый тип decimal. Если в это поле мы пытаемся положить число 5.20, то оно автоматически обрезается до 5.2, а это уже не удовлетворяет формату схемы. 1С Выдает ошибку несоответствия формата. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |