17.02.2015, 10:24 | #1 |
Участник
|
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 |
Участник
|
А как именно вылетает-то? У меня такой код нормально отрабатывает.
|
|
17.02.2015, 11:22 | #3 |
Участник
|
"Название кодировки "w" не поддерживается.
Имя параметра: name" Раскудрить его в карамысло... |
|
17.02.2015, 11:41 | #4 |
Участник
|
Если вынести ваш фрагмент кода по созданию XML-файла в job'ик, тоже воспроизводится? У меня лично приведенный код + несколько строк собственно записи файла прекрасно отработали и создали XML-файл в нужной кодировке.
|
|
17.02.2015, 11:48 | #5 |
Участник
|
Так это из джобика и есть. Метод берется из рабочего класса.
В идеале хотелось бы видеть вот такую строчку: <?xml version="1.0" encoding="windows-1251"?> |
|
17.02.2015, 12:05 | #6 |
Участник
|
Ларчик просто открывался. Надо запускать класс как Client, а не через Server.
|
|
17.02.2015, 12:39 | #7 |
Участник
|
Может наивный вопрос, а как в пакете запускать такую проблему.
"Олицетворенный на сервере (RunAs) сеанс попытался вызвать метод, который доступен только на клиенте." |
|
17.02.2015, 13:02 | #8 |
Участник
|
можно сразу создавать xml из строки "<?xml version="1.0" encoding="windows-1251"?>"
|
|
17.02.2015, 13:07 | #9 |
Участник
|
А код можно? А то уже голову клинит.
|
|
17.02.2015, 14:03 | #10 |
Участник
|
xmlstr = '<?xml version="1.0" encoding="windows-1251"?>';
xmlDocument.loadXml(xmlStr); |
|
18.02.2015, 05:31 | #11 |
Участник
|
А как в таком случае создавать файл XML?
|
|
18.02.2015, 10:39 | #12 |
Участник
|
xmlDocument.save("c:\\filename.xml")
|
|
|
За это сообщение автора поблагодарили: yuriy_64 (1). |
18.02.2015, 11:13 | #13 |
Участник
|
Не то!!!!!
Использую для создания файла XMLTextWriter, а не XMLDocument Файл создается таким образом: writer = XMlTextWriter::newFile(lfileName+".xml"); Если использовать в пакете (Server) writer = XMlTextWriter::newFile(fileName + locId+".xml",'windows-1251');, вылетает ошибка. Суть проблемы: записать кодировку в первую строчку. Другие вариации не приемлимы. Использовать приходится XMlTextWriter!!!!!!!!! |
|
18.02.2015, 12:00 | #14 |
Участник
|
Пожалуйста, не надо тут истерик. У XmlTextWriter есть методы newXml() и writeToString(). Пишите в XmlTextWriter, затем получите от него строку с XML-данными и сохраните их с помощью XmlDocument.
|
|
18.02.2015, 12:12 | #15 |
Участник
|
Извините, просто где то рядом хожу, а она (проблема) не налаживается.
Еще раз извините. Файл то создается, а вот из-за одной строчки понять не могут. "Пишите в XmlTextWriter, затем получите от него строку с XML-данными и сохраните их с помощью XmlDocument." А можно код? Пожалуйста. |
|
18.02.2015, 13:30 | #16 |
Участник
|
Я в итоге обошелся без 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(); |
|
|
За это сообщение автора поблагодарили: yuriy_64 (1). |
19.02.2015, 04:02 | #17 |
Участник
|
Спасибо, вечером проверю.
|
|
20.02.2015, 06:47 | #18 |
Участник
|
Или я туплю или лыжи по траве не ездят
"Свойство 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 |
Участник
|
Надо понимать, что классы ядра Аксапты для работы с XML и классы .NET Framework из пространства имен System.Xml не тождественны, поэтому справку лучше читать именно по классам ядра Аксапты. Сравните хотя бы статические методы для создания экземпляра XmlWriter в .NET Framework и в Аксапте: в последней нет вариантов создания объекта на основе StreamWriter или TextWriter, поэтому, на мой взгляд, приведенные рассуждения из статьи MSDN тут неприменимы.
Я, собственно, в MSDN не углублялся, а просто сделал тестовый джобик и запустил его на сервере с помощью пункта меню - при использовании XmlWriter, как показано выше, у меня сгенерился файл в кодировке CP1251 с корректным текстом кириллицей. Правда, я не пробовал запускать приведенный код в CIL - с этим были какие-то проблемы? |
|