XML с русскими тегами

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

XML с русскими тегами

Сообщение alexs » 14.08.2017 09:38:41

Это возможно. Был абсолютно уверен - что должно работать через штатный XML движок. Начал тестировать - облом.

Начал делать интеграцию по отправке данных. Согласно вот этого приказа.
https://normativ.kontur.ru/document?mod ... tId=285035

Может кто посоветует чего?

Вот мой пример:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  D: TXMLDocument;
  P, P1: TDOMElement;
begin
  D:=TXMLDocument.Create;
  P:=D.CreateElement('TEST');
  D.AppendChild(P);
  P1:=D.CreateElement('TEST');
  P1.SetAttribute('aa', 'SetAttribute');
  P.AppendChild(P1);

  P1:=D.CreateElement('ПримерТекст');
  P1.SetAttribute('НомерПер', '12,254 ,,51');
  P.AppendChild(P1);

  WriteXML(D, '/home/alexs/base/aa.xml');
  D.Free;
end;   
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3476
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: XML с русскими тегами

Сообщение gvido » 14.08.2017 10:57:35

Добрый день. Тут недавно выкладывали последний бесплатный релиз OXMLhttp://freepascal.ru/forum/viewtopic.php?f=5&t=10324. Он вроде бы дружил с русским.
У стандартного, если я не ошибаюсь было жуткое неудобство - при чтении xml не любил строку с указанием кодировки файла.
Вот это категорически не любил:
<?xml version ="1.0"encoding="windows-1251"?>
gvido
постоялец
 
Сообщения: 174
Зарегистрирован: 28.03.2012 11:35:31

Re: XML с русскими тегами

Сообщение alexs » 14.08.2017 11:06:33

Уже понял как победить. Не хочется тащить лишние библиотеки. Всё дело в самом FPC, вернее в перекодировках строк.

Код: Выделить всё
var
...
  S: String;
begin
...
  S:='ПримерТекст';
  P1:=D.CreateElement(S);
  S:='НомерПер';
  P1.SetAttribute(S, '12,254 ,,51');
  P.AppendChild(P1);

Вот так будет работать
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3476
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: XML с русскими тегами

Сообщение vitaly_l » 14.08.2017 11:11:24

Код: Выделить всё
uses DOM,XMLWrite,XMLRead,lazUtils,lazUTF8;   

procedure TForm1.Button1Click(Sender: TObject);
var
  xdoc: TXMLDocument;                                  // переменная документа
  RootNode, parentNode, nofilho: TDOMNode;             // переменная узла документа
  s:string;
begin
  s := 'Привет';//Utf8ToWinCp('Привет'); // единый проверочный тест на русском

  //Создаём документ
  xdoc := TXMLDocument.create;

  //Создаём корневой узел
  RootNode := xdoc.CreateElement(s);
  Xdoc.Appendchild(RootNode);                           // Добавляем корневой узел в документ

  //Создаём родительский узел
  RootNode:= xdoc.DocumentElement;
  parentNode := xdoc.CreateElement(s);
  TDOMElement(parentNode).SetAttribute('id', s);       // создаём атрибуты родительского узла
  RootNode.Appendchild(parentNode);                        // добавляем родительский узел

  //Создаём дочерний узел
  parentNode := xdoc.CreateElement(s);
  //TDOMElement(parentNode).SetAttribute('sexo', 'M');     // создаём его атрибуты
  nofilho := xdoc.CreateTextNode(s);              // вставляем значение в узел
  parentNode.Appendchild(nofilho);                         // сохраняем узел
  RootNode.ChildNodes.Item[0].AppendChild(parentNode);     // вставляем дочерний узел в соответствующий родительский

  //Создаём ещё одиндочерний узел
  parentNode := xdoc.CreateElement(s);
  //TDOMElement(parentNode).SetAttribute('ano', '1976');   // создаём его атрибуты
  nofilho := xdoc.CreateTextNode(s);                    // вставляем значение в узел
  parentNode.Appendchild(nofilho);                         // сохраняем узел
  RootNode.ChildNodes.Item[0].AppendChild(parentNode);    // вставляем дочерний узел в соответствующий родительский

  writeXMLFile(xDoc,'teste.xml');                          // записываем всё в XML-файл
  Xdoc.free;                                               // освобождаем память
end;   
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3064
Зарегистрирован: 31.01.2012 16:41:41

Re: XML с русскими тегами

Сообщение alexs » 14.08.2017 11:31:14

vitaly_l
Ошибка возникает при передаче русского имени параметра в качестве имени тега прямой константой.
Если через переменную - то всё норм.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3476
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: XML с русскими тегами

Сообщение vitaly_l » 14.08.2017 11:37:16

alexs писал(а):Если через переменную - то всё норм.

Да, я тоже уже освоил этот "приём" декодирования, но привыкнуть сложно и поэтому тоже всё время про него забываю.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3064
Зарегистрирован: 31.01.2012 16:41:41

Re: XML с русскими тегами

Сообщение alexs » 14.08.2017 11:40:29

Осталось дописать обёртку для перевода итогового файла в Win1251 кодировку.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3476
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: XML с русскими тегами

Сообщение vitaly_l » 14.08.2017 13:09:57

alexs писал(а):в Win1251 кодировку

Вообще это должна делать вот эта функция: SetHeaderData("версия", "кодировка").
Версию XML она задаёт, а вот кодировку почему-то возвращает обратно в UTF-8.

Добавлено спустя 7 минут 53 секунды:
В коде посмотрел, они только UTF8 сделали:
Код: Выделить всё
procedure TXMLWriter.VisitDocument(node: TDOMNode);
var
  child: TDOMNode;
begin
  // Here we ignore doc.xmlEncoding and write a fixed utf-8 label,
  // because it is the only output encoding currently supported.
  WriteXMLDecl(TXMLDocument(node).XMLVersion, 'utf-8', (ord(TXMLDocument(node).XMLStandalone)-1) or 1);
                                   
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3064
Зарегистрирован: 31.01.2012 16:41:41

Re: XML с русскими тегами

Сообщение alexs » 15.08.2017 09:27:16

То, что сохранение в других кодировках не работает - это я сразу увидел. Решается таким костылём:
Код: Выделить всё
procedure WriteXMLWin1251(Element: TDOMNode; const AFileName: String);
var
  F, F1:TextFile;
  S, SL: String;
begin
  S:=GetTempFileName;
  WriteXML(Element, S);
  AssignFile(F, S);
  Reset(F);

  AssignFile(F1, AFileName);
  Rewrite(F1);
  TextRec(F1).CodePage:=1251;

  ReadLn(F, SL);
  SL:='<?xml version="1.0" encoding="windows-1251"?>';
  WriteLn(F1, SL);

  while not Eof(F) do
  begin
    ReadLn(F, SL);
    WriteLn(F1, SL)
  end;
  CloseFile(F);
  CloseFile(F1);
  DeleteFile(S);
end;



Добавлено спустя 6 часов 13 минут 4 секунды:
Как результат работы делюсь простой формой - забивалкой данных для создания xml файла по

ФЕДЕРАЛЬНАЯ НАЛОГОВАЯ СЛУЖБА
ПРИКАЗ
от 25 января 2017 г. N ММВ-7-2/34@
ОБ УТВЕРЖДЕНИИ ФОРМЫ И ФОРМАТА УВЕДОМЛЕНИЯ О НЕВОЗМОЖНОСТИ ПРЕДСТАВЛЕНИЯ В УСТАНОВЛЕННЫЕ СРОКИ ДОКУМЕНТОВ (ИНФОРМАЦИИ) В ЭЛЕКТРОННОЙ ФОРМЕ


Вроде формирую всё верно.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3476
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: XML с русскими тегами

Сообщение vada » 15.08.2017 17:29:54

На сколько помню, стандарт XML подразумевает кодировку ТОЛЬКО utf8.
<?xml version ="1.0"encoding="utf8"?>
Не слышал что в этом вопросе что-то поменяли.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 649
Зарегистрирован: 14.02.2006 13:43:17

Re: XML с русскими тегами

Сообщение Vadim » 15.08.2017 17:37:51

vada писал(а):Не слышал что в этом вопросе что-то поменяли.

Центробанк очень долго выдавал XML-инфу со своего сайта именно в кодировке 1251 и в заголовке там стояло именно 1251. Видимо о стандарте XML мало кто слышал... :-)
Vadim
долгожитель
 
Сообщения: 2616
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: XML с русскими тегами

Сообщение Sergei I. Gorelkin » 15.08.2017 17:46:37

XML стандарт предписывает обязательную поддержку utf-8 и utf-16 обоих endian, остальные кодировки опционально. Собственно для этого предусмотрено указание кодировки в заголовке.
С другой строны, есть стандарт "канонической формы" XML, где кодировка только utf-8, а заголовок недопустим.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1368
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: XML с русскими тегами

Сообщение vitaly_l » 15.08.2017 19:15:20

Очевидно программисты, специально простебались над компактностью записи в XML и поэтому оставили исключительно только громоздкие кодировки, чтобы файлы были неподъёмными, а диски кипели при перезаписи и быстро кончались при хранении.

:roll: Что-то мне подсказывает, что формат XML придумали изготовители жёстких дисков, а не программисты.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3064
Зарегистрирован: 31.01.2012 16:41:41

Re: XML с русскими тегами

Сообщение Лекс Айрин » 15.08.2017 19:43:56

vitaly_l писал(а): Что-то мне подсказывает, что формат XML придумали изготовители жёстких дисков, а не программисты.


Слив засчитан. Насколько я помню, XML придумали вебпрограммисты, для удобства метопоисковиков.(чтобы сделать семантический веб). Потом уже его стали использовать не по профилю. Судя по текущему положению вещей, изначальная инициатива была всеми дружно слита в канализацию(((
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4090
Зарегистрирован: 19.02.2013 16:54:51

Re: XML с русскими тегами

Сообщение pupsik » 15.08.2017 22:26:36

alexs iconv не умеет сохранять в разных кодировках, или его уже вырезали из хмл лазаря?? Ведь для чтения, если не изменяет память, парсёр хмл использует его .
pupsik
энтузиаст
 
Сообщения: 1008
Зарегистрирован: 20.08.2014 16:20:13

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 1

Рейтинг@Mail.ru