AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.02.2015, 10:24   #1  
yuriy_64 is offline
yuriy_64
Участник
 
88 / 10 (1) +
Регистрация: 21.03.2014
? XMLTextWriter в кодировку 1251
Доброе время суток!
При создании XML файла необходимо прописать кодировку "WIDOWS-1251".
Пытаюсь прописать:
#define.XmlTextWriterEncoding("WINDOWS-1251")
...
new FileIOPermission(fileNameS, 'rw').assert();
writer = XMlTextWriter::newFile(fileNameS, #XmlTextWriterEncoding);
После чего вылетает. Что не так делаю?
Старый 17.02.2015, 11:04   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
А как именно вылетает-то? У меня такой код нормально отрабатывает.
Старый 17.02.2015, 11:22   #3  
yuriy_64 is offline
yuriy_64
Участник
 
88 / 10 (1) +
Регистрация: 21.03.2014
"Название кодировки "w" не поддерживается.
Имя параметра: name"
Раскудрить его в карамысло...
Старый 17.02.2015, 11:41   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Если вынести ваш фрагмент кода по созданию XML-файла в job'ик, тоже воспроизводится? У меня лично приведенный код + несколько строк собственно записи файла прекрасно отработали и создали XML-файл в нужной кодировке.
Старый 17.02.2015, 11:48   #5  
yuriy_64 is offline
yuriy_64
Участник
 
88 / 10 (1) +
Регистрация: 21.03.2014
Так это из джобика и есть. Метод берется из рабочего класса.
В идеале хотелось бы видеть вот такую строчку:
<?xml version="1.0" encoding="windows-1251"?>
Старый 17.02.2015, 12:05   #6  
yuriy_64 is offline
yuriy_64
Участник
 
88 / 10 (1) +
Регистрация: 21.03.2014
Ларчик просто открывался. Надо запускать класс как Client, а не через Server.
Старый 17.02.2015, 12:39   #7  
yuriy_64 is offline
yuriy_64
Участник
 
88 / 10 (1) +
Регистрация: 21.03.2014
Может наивный вопрос, а как в пакете запускать такую проблему.
"Олицетворенный на сервере (RunAs) сеанс попытался вызвать метод, который доступен только на клиенте."
Старый 17.02.2015, 13:02   #8  
AlexeyS is offline
AlexeyS
Участник
 
404 / 339 (12) ++++++
Регистрация: 15.06.2004
Адрес: москва
можно сразу создавать xml из строки "<?xml version="1.0" encoding="windows-1251"?>"
Старый 17.02.2015, 13:07   #9  
yuriy_64 is offline
yuriy_64
Участник
 
88 / 10 (1) +
Регистрация: 21.03.2014
А код можно? А то уже голову клинит.
Старый 17.02.2015, 14:03   #10  
AlexeyS is offline
AlexeyS
Участник
 
404 / 339 (12) ++++++
Регистрация: 15.06.2004
Адрес: москва
xmlstr = '<?xml version="1.0" encoding="windows-1251"?>';
xmlDocument.loadXml(xmlStr);
Старый 18.02.2015, 05:31   #11  
yuriy_64 is offline
yuriy_64
Участник
 
88 / 10 (1) +
Регистрация: 21.03.2014
А как в таком случае создавать файл XML?
Старый 18.02.2015, 10:39   #12  
AlexeyS is offline
AlexeyS
Участник
 
404 / 339 (12) ++++++
Регистрация: 15.06.2004
Адрес: москва
xmlDocument.save("c:\\filename.xml")
За это сообщение автора поблагодарили: yuriy_64 (1).
Старый 18.02.2015, 11:13   #13  
yuriy_64 is offline
yuriy_64
Участник
 
88 / 10 (1) +
Регистрация: 21.03.2014
Не то!!!!!
Использую для создания файла XMLTextWriter, а не XMLDocument
Файл создается таким образом:
writer = XMlTextWriter::newFile(lfileName+".xml");
Если использовать в пакете (Server)
writer = XMlTextWriter::newFile(fileName + locId+".xml",'windows-1251');, вылетает ошибка.
Суть проблемы: записать кодировку в первую строчку.
Другие вариации не приемлимы. Использовать приходится XMlTextWriter!!!!!!!!!
Старый 18.02.2015, 12:00   #14  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Пожалуйста, не надо тут истерик. У XmlTextWriter есть методы newXml() и writeToString(). Пишите в XmlTextWriter, затем получите от него строку с XML-данными и сохраните их с помощью XmlDocument.
Старый 18.02.2015, 12:12   #15  
yuriy_64 is offline
yuriy_64
Участник
 
88 / 10 (1) +
Регистрация: 21.03.2014
Извините, просто где то рядом хожу, а она (проблема) не налаживается.
Еще раз извините. Файл то создается, а вот из-за одной строчки понять не могут.
"Пишите в XmlTextWriter, затем получите от него строку с XML-данными и сохраните их с помощью XmlDocument."
А можно код? Пожалуйста.
Старый 18.02.2015, 13:30   #16  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Я в итоге обошелся без XmlDocument, правда, XmlTextWriter пришлось заменить на XmlWriter, но с т.з. кода, пишущего XML, это изменение не должно на что-то повлиять.
X++:
#macrolib.File
#define.XmlTextWriterEncoding('windows-1251')

Filename            fileNameS;
XmlWriterSettings   writerSettings;
XmlWriter           xmlWriter;

void writeXML(XmlTextWriter _writer)
{
    _writer.writeStartElement('root');
    _writer.writeStartElement('test');
    _writer.writeAttributeString('attr1', 'значение1');
    _writer.writeAttributeString('attr2', 'значение2');
    _writer.writeEndElement();
    _writer.writeEndElement();
}    
;
if (isRunningOnServer())
{
    new FileIOPermission('', #io_read).assert();
    fileNameS = WinAPIServer::getTempFileName();
    CodeAccessPermission::revertAssert();
}
else
{
    fileNameS = WinAPI::getTempFilename(WinAPI::getTempPath(), 'xml');
}
info(strFmt('%1 %2', xGlobal::computerName(), fileNameS));
new FileIOPermission(fileNameS, #io_write).assert();
writerSettings = new XmlWriterSettings();
writerSettings.encoding(#XmlTextWriterEncoding);
xmlWriter = XmlWriter::newFile(fileNameS, writerSettings);
xmlWriter.writeStartDocument();

writeXML(xmlWriter);

xmlWriter.writeEndDocument();
xmlWriter.close();
NB! Если код записи в XML будет выполняться в CIL, то может понадобиться заменить тип параметра в вызовах с XmlTextWriter на XmlWriter.
За это сообщение автора поблагодарили: yuriy_64 (1).
Старый 19.02.2015, 04:02   #17  
yuriy_64 is offline
yuriy_64
Участник
 
88 / 10 (1) +
Регистрация: 21.03.2014
Спасибо, вечером проверю.
Старый 20.02.2015, 06:47   #18  
yuriy_64 is offline
yuriy_64
Участник
 
88 / 10 (1) +
Регистрация: 21.03.2014
Или я туплю или лыжи по траве не ездят
"Свойство Encoding применимо только к экземплярам XmlWriter, созданным с помощью указанного Stream или указанного имени файла. Если экземпляр XmlWriter создан с указанным объектом TextWriter, свойство Encoding переопределяется с помощью кодирования базового объекта TextWriter. Например, если это свойство имеет значение Юникода (UTF-16) для конкретного XmlWriter, но является основным средством записи StreamWriter (который является производным от TextWriter) с его кодировкой, заданной как UTF8, выходные данные будут в кодировке UTF-8. "https://msdn.microsoft.com/ru-ru/lib...vs.110%29.aspx
С XMLTextWriter не прокатило.
Старый 20.02.2015, 09:57   #19  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Надо понимать, что классы ядра Аксапты для работы с XML и классы .NET Framework из пространства имен System.Xml не тождественны, поэтому справку лучше читать именно по классам ядра Аксапты. Сравните хотя бы статические методы для создания экземпляра XmlWriter в .NET Framework и в Аксапте: в последней нет вариантов создания объекта на основе StreamWriter или TextWriter, поэтому, на мой взгляд, приведенные рассуждения из статьи MSDN тут неприменимы.
Я, собственно, в MSDN не углублялся, а просто сделал тестовый джобик и запустил его на сервере с помощью пункта меню - при использовании XmlWriter, как показано выше, у меня сгенерился файл в кодировке CP1251 с корректным текстом кириллицей. Правда, я не пробовал запускать приведенный код в CIL - с этим были какие-то проблемы?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Перекодировать файл в DOS кодировку Eldar9x DAX: Программирование 2 12.05.2010 14:55
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:28.