Вход | Регистрация


XDTO. Переносы строк в xml файле.

XDTO. Переносы строк в xml файле.
Я
   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 в карму)
 
 
   asady
 
1 - 06.11.18 - 10:41
(0) что-то типа этого

типУТ = ФабрикаXDTO.Тип("http://url.url/UT/2017-08-21","УТ";);
   DmitrO
 
2 - 06.11.18 - 10:59
В объекте ЗаписьXML настраивается и 1 и 2.
>>Создаю xml файл используя пакеты XDTO
Как так формируется xml файл с использованием XDTO, и не используя ЗаписьXML, не понятно. Это даже как-то постараться надо. :)
   SuKaS
 
3 - 06.11.18 - 12:11
(1) Так тип не получить. Получить надо тип конкретного объекта пространства имен.
Например: типУТ_ФИО = ФабрикаXDTO.Тип("http://url.url/UT/2017-08-21","УТ";, "ТипФИО");

(2) Не совсем правильно выразился. Имеется ввиду, что запись формируется механизмами XDTO и указанными схемами. Без использования методов ЗаписьXML.ЗаписатьНачалоЭлемента ЗаписьXML.ЗаписатьАтрибут и ЗаписьXML.ЗаписатьКонецЭлемента
   DmitrO
 
4 - 06.11.18 - 12:20
по пунктам:
1. Смотри в СП объект ПараметрыЗаписиXML отступы настраиваются там и по умолчанию они вроде итак заданы.
2. Смотри метод ЗаписатьСоответствиеПространстваИмен у объекта ЗаписьXML. Все используемые пространства имен можно объявить в корневом элементе.
   arsik
 
5 - 06.11.18 - 12:29
(0) xsd схема то есть у вас? Если ест то, например делаете так:
Фабрика = СоздатьФабрикуXDTO(ПутьКМоемуФайлуСхемы);

ПростанствоИмен = "http://url.url/UT/2017-08-21";;
ТипУТ = Фабрика.Тип(ПростанствоИмен,"УТ");
ОбъектУТ = Фабрика.Создать(ТипУТ);
ОбъектУТ.Дата = '20170331';
ОбъектУТ.Номер = '654684';

   SuKaS
 
6 - 06.11.18 - 13:47
(4) ЗаписатьСоответствиеПространстваИмен используется при использовании ЗаписьXML.ЗаписатьНачалоЭлемента и вызывается после него. Я же не использую ЗаписатьНачалоЭлемента, все элементы записываются автоматически механизмом XDTO.
   SuKaS
 
7 - 06.11.18 - 13:52
(4) ПараметрыЗаписиXML помогли, большое спасибо!
Смутило по началу, что свойства не доступны для записи.
Так работает:
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Истина); 

Так не работает:
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML(); 
ПараметрыЗаписиXML.Отступ = Истина;
   DmitrO
 
8 - 06.11.18 - 14:02
(6)да, а вот чтобы объявить префиксы пространств имен один раз, корневой элемент надо делать ручками (ЗаписатьНачалоЭлемента), потом нахлобучивать префиксы пространств имен, потом уже вдувать в файл объекты XDTO сериализатором или фабрикой, ну и в конце ручками закрыть корневой элемент.
   SuKaS
 
9 - 06.11.18 - 14:45
(8) Большое спасибо, попробую.
Еще вопросик небольшой, может сталкивались. В схеме прописан тип данных "ТипДеньгиКоп". Подразумевается, что формат будет с копейками, т.е. число 5 должно записаться как 5.00.
Бился пару дней с этой проблемой, по итогу исправил тип в схеме на строку и пишу строку "5.00". 1С настырно отбрасывает лишние по ее мнению нули.
Хотя образец в схеме прописан "\-?[0-9]+\.\d{2}"
   SuKaS
 
10 - 06.11.18 - 15:10
(8) Спасибо, это помогло. Правда немного увеличило код. Ранее вся запись в файл была в одну строку - это запись корневого элемента. Теперь немного увеличилось, но вроде работает.
Но теперь не ясно, как сделать запись о пространстве имен без префикса... Т.е. самое первое пространство имен, основное так сказать.
 
 Рекламное место пустует
   DmitrO
 
11 - 06.11.18 - 15:16
(9)Если у типа задан образец, то базовый тип у него string, а мы туда число пихаем. Объект XDTO не преобразовывает числа к строке по образцу, вместо этого 1С по своему обыкновению просто не явно преобразует число к строке.

Выдерживать образец это задача самого программиста. Т.е. сам форматируй функцией Формат и пихай строку.

Это разработчики схемы надурили, им надо было взять базовый тип decimal, и ограничить его как надо. Тогда бы работало с присвоением числа.
   DmitrO
 
12 - 06.11.18 - 15:22
(10)пространство имен без префикса это тоже определенное пространство имен и задается так: ЗаписатьСоответствиеПространстваИмен("", "тут uri ПИ").

Имя элемента, в котором объявляется префикс пространства имен, уже может содержать этот префикс.
   DmitrO
 
13 - 06.11.18 - 15:33
С точки зрения xml парсеров это два совершенно одинаковых квалифицированных элемента:

<n1:data xmlns:n1="uri_test" />
<data xmlns="uri_test" />

Для них это одно и тоже, читаться и соответствовать схеме будет и то и это.
   SuKaS
 
14 - 06.11.18 - 16:05
(12) Да, это я сам допер. С именами. А вот по типам не до конца.
Есть такая структура:
<СВ>
  <Сумма>6975.49</Сумма>
  <Доход>2480.48</Доход>
</СВ>
"Сумма" и "Доход" имеют тип "ТипДеньги", который описан в другом пространстве имен как ТипыЗначений.

А уже во втором пространстве имен есть описание ТипаЗначений "ТипДеньги" как атомарного типа. И в нем базовый тип decimal.

Если в это поле мы пытаемся положить число 5.20, то оно автоматически обрезается до 5.2, а это уже не удовлетворяет формату схемы. 1С Выдает ошибку несоответствия формата.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует