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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.01.2008, 18:30   #1  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Перевод строки в xml-файле
Подскажите, пожалуйста, есть ли возможность сформировать xml-файл на основе шаблона, подготовленного в Excel, и записать в ячейку текст с переводом строки?

Т.е. в ячейку вывести не "1. первая строка 2. вторая строка", а
"1. первая строка
2. вторая строка".

Используются стандартные классы XMLDocument, XMLElement.

При записи, например, текст "&#10" (перевод строки в нотации xml), Аксапта меняет на "&#10", что отображается как обычный текст
__________________
Ivanhoe as is..
Старый 01.02.2008, 07:42   #2  
Бриллиантик is offline
Бриллиантик
Участник
 
15 / 10 (1) +
Регистрация: 31.01.2008
Привет, я меня тоже есть вопрос, надеюсь получить ответ, а может мой вопрос перенесут/переадресуют куда надо, я здесь новичок, так что сорри
Вопрос про импорт из Аксапты в XML-файл, а этот файл дальше попадает в какую-то налоговую прогу
вот например строки из Аксапты
this.xmlSetPageAttr('osn', 0);
this.xmlSetPageAttr('corr', 1);
this.xmlSetPageAttr('uved', 0);
this.xmlSetPageAttr('n_uved/' ????);
this.xmlSetPageAttr('d_uved/' ????);
В XML-файле это выглядит так:
<osn>0</osn>
<corr>1</corr>
<uved></uved>
<n_uved/>
<d_uved/>

<> </>- это открывающий и закрывающий тег, а вот что значит этот <n_uved/> and <d_uved/>???? что написать после кавычки вместо знака вопроса
Мне сказали что это единичный тег, а как его написать чтобы он преобразовался из
this.xmlSetPageAttr('n_uved/' ?) в <n_uved/>

Большая просьба- ответить в кратчайшие сроки, плиз
Старый 01.02.2008, 16:37   #3  
Asterisk is offline
Asterisk
Участник
 
36 / 16 (1) ++
Регистрация: 24.10.2005
Адрес: Москва
Совет - обоим.
Посмотрите класс RPayNDFL2File . Это выгрузка справки 2НФЛ в XML . Запускается из реестра сведений о доходах - формы RpayTaxListTable. Там уж наверняка в том формате который вам нужен . А еще лучше поиграться с классом и глазками посмотреть на то что он выгружает . Думаю все вопросы сами собой отпадут
Старый 01.02.2008, 16:42   #4  
Asterisk is offline
Asterisk
Участник
 
36 / 16 (1) ++
Регистрация: 24.10.2005
Адрес: Москва
Особенно пристально обратить внимание на метод

protected XMLElement appendXMLElement(XMLElement _toXmlElement, str _elementName, str _elementValue)
{
XMLElement xmlElement;
XMLText xmlText;
;

xmlElement = xmlDoc.createElement(_elementName);
xmlText = xmlDoc.createTextNode(_elementValue);
xmlElement.appendChild(xmlText);

_toXmlElement.appendChild(xmlElement);
_toXmlElement.appendChild(xmlDoc.createTextNode(#delimiterEnter));

return xmlElement;
}

где
#define.delimiterEnter('\n')

- видимо как раз то что нужно Ivanhoe
Старый 29.11.2008, 17:06   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Asterisk Посмотреть сообщение
_toXmlElement.appendChild(xmlDoc.createTextNode(#delimiterEnter));
Какой-то закат солнца вручную.

А можно что-нибудь замутить с xmlNode.prefix, xmlNode.InserAfter, xmlDoc.createSignificantWhitespace, xmlDoc.preserveWhitespace?
примеров кода не могу найти.
__________________
полезное на axForum, github, vk, coub.
Старый 29.11.2008, 17:50   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Asterisk Посмотреть сообщение
_toXmlElement.appendChild(xmlDoc.createTextNode(#delimiterEnter));
Угу. Пока не понял до конца.
Но использовать XMLelement и XMLdocument для форматирования вывода - закат солнца вручную.
xmlDocument, xmlNode, xmlElement - это для хранения разобранного XML в памяти (!) и для работы с ним.

Для вывода нужно пользоваться классом xmlWriter, который просто выводит в планарный неразобранный текст. См. перекрестные ссылки, чтобы посмотреть пример использования.

Ну и про экранирование спец.символов - ура! - оно экранирует.
Для записи спецсимволов используется слэш-нотация '\n', '\r', '\t' и т.д.
__________________
полезное на axForum, github, vk, coub.
Старый 29.11.2008, 18:16   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Разобрался.
Можно и xmlDocument выводить.

Выложу пример кода, чтобы потом самому не вспоминать
X++:
static void Job1(Args _args)
{
    XmlDocument doc = XmlDocument::newBlank();
    XmlElement  root;
    XmlElement  channel;

    XMLWriterSettings xmlWriterSettings = new XMLwriterSettings();
    XMLWriter   xml;

    root = doc.appendChild(doc.createElement("rss"));
    root.setAttribute("version","2.0");

    channel = root.appendChild(doc.createElement("channel"));
    channel.appendChild(doc.createElement("title")).innerText("Text for title");
    channel.appendChild(doc.createElement("description")).innerText("Text for description");
    channel.appendChild(doc.createElement("link")).innerText("http://mySuperLink");

    xmlWriterSettings.indent(true);
    //xmlWriterSettings.indentChars('  '); // можно и не указывать
    xml = XMLwriter::newXml(xmlWriterSettings);

    doc.writeTo(xml);
    xml.flush();

    info(xml.writeToString());
}
получится вот такое
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 740
Размер:	43.7 Кб
ID:	4003

Но вообще говоря, xmlDocument - это избыточно, если нужно всего-лишь вывести генерируемый на лету xml.
Если xml только выводится, то вполне достаточно следующего кода
X++:
xml.writeStartDocument();
xml.writeStartElement("rss");
xml.writeAttributeString("version","2.0");
   xml.writeStartElement("channel");
   ...
   xml.writeEndElement();
xml.writeEndElement();
xml.writeEndDocument();

Во writerSettings можно задавать и символы перевода строки, и строку для отступов и т.п.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Maxim Gorbunov (3), alex55 (1).
Старый 29.11.2008, 19:03   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Спасибо, добрый человек, _scorp_, что послал к источнику знаний - MSDN

в общем, в Аксапте реализована обертка к .net классу System.Xml.XmlWriter
Документация здесь http://msdn.microsoft.com/ru-ru/libr...xmlwriter.aspx
краткое описание http://msdn.microsoft.com/ru-ru/library/4d1k42hb.aspx

документация на system.xml.xmlwritersettings
http://msdn.microsoft.com/ru-ru/libr...rsettings.aspx

документация на system.xml.xmldocument
http://msdn.microsoft.com/ru-ru/libr...ldocument.aspx

документация на System.Xml.XmlNode
http://msdn.microsoft.com/ru-ru/libr...l.xmlnode.aspx

Ну, и так далее...

Кроме того, интересное описание реализации похожей штуки http://ru2.php.net/manual/ru/book.xmlwriter.php

В общем, не надо выполнять "закат солнца вручную".
Надо просто доку поискать.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Asterisk (1).
Старый 01.12.2008, 09:43   #9  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Если вернутся к исходному вопросу темы - как сделать перевод строки внутри одного child? Я не программист, может не так что-то объясняю?

В приведенном mazzy примере, как сделать чтобы "Text for description" вывелось так:
"Text for
description"
__________________
Ivanhoe as is..
Старый 01.12.2008, 09:48   #10  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Для записи спецсимволов используется слэш-нотация '\n', '\r', '\t' и т.д
А это разве не работает?
__________________
Zhirenkov Vitaly
Старый 01.12.2008, 10:01   #11  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
В том то и дело, что нет.
__________________
Ivanhoe as is..
Старый 01.12.2008, 10:04   #12  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от ZVV Посмотреть сообщение
А это разве не работает?
Работает
X++:
static void Job1(Args _args)
{
    XMLDocument doc = XMLDocument::newBlank();
    ;
    doc.appendChild(doc.createElement('zed')).text('test\r\nit');
    doc.save('c:\\test.xml');
}
Старый 01.12.2008, 10:17   #13  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
В том то и дело, что нет.
Цитата:
Сообщение от belugin Посмотреть сообщение
Работает
X++:
static void Job1(Args _args)
{
    XMLDocument doc = XMLDocument::newBlank();
    ;
    doc.appendChild(doc.createElement('zed')).text('test\r\nit');
    doc.save('c:\\test.xml');
}
кстати, прикольно...
Если открыть в блокнотике, то видно, что работает.
А вот в IE этого перевода строки не видно.
__________________
Zhirenkov Vitaly
Старый 01.12.2008, 10:20   #14  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Исходно интересует Excel
__________________
Ivanhoe as is..
Старый 01.12.2008, 10:29   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
С точки зрения XML и HTML этот перевод ничего не значит просто.

что надо сгенерить с точки зрения XML? Entity какую-нибудь?

Если имеется ввиду xlsx то там так же как я написал - то есть должно прокатить

Последний раз редактировалось belugin; 01.12.2008 в 10:33.
Старый 01.12.2008, 11:05   #16  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от ZVV Посмотреть сообщение
кстати, прикольно...
Если открыть в блокнотике, то видно, что работает.
А вот в IE этого перевода строки не видно.
Если нужно осуществить перевод строки в html, так и спользуйте html - выводите вместо \n тэг <br>
Старый 01.12.2008, 11:07   #17  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Если просто запустить приведенный джоб, то все работает и в Excel.

Сейчас нашел место, где происходит собственно потеря переноса строки. У нас есть следующий метод в новом классе для вывода отчетов в xml-Excel:

X++:
client static void setNodeText(XMLElement _e, str _text)
{
    ;
    _e.text(_text);
}
_text сформирован с использованием \r\n. При наведении курсора в дебагере на него видим текст с переносом строки. Но после выполнения метода, если мы посмотрим на сформированный xml-файл, то там уже этот перенос строки отсутствует

Куда копать?
__________________
Ivanhoe as is..
Старый 01.12.2008, 11:30   #18  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
При наведении курсора в дебагере на него видим текст с переносом строки. Но после выполнения метода, если мы посмотрим на сформированный xml-файл, то там уже этот перенос строки отсутствует
Куда копать?
А зачем в xml-файле вообще использовать переносы? Для красоты? Я считаю что это вообще лишние символы, которые только увеличивают размер файла. Если вам нужна красота то используйте отдельный просмотрщик xml, напимер этот http://www.microsoft.com/downloads/d...displaylang=en
Старый 01.12.2008, 11:44   #19  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Небольшое исследование по выводу переноса в Excel-xml:

1. То, что формируется у меня - с потеряным переносом, в Екселе, понятно, в одну строку выводится:
<Cell ss:StyleID="s29"><Data ss:Type="String">test it</Data></Cell>

2. Формирую строку указанным джобом, копирую в текстовом редакторе текст, получаю строку:
<Cell ss:StyleID="s29"><Data ss:Type="String">test
it</Data></Cell>
Эта строка в текстовом редакторе переносится, но в Екселе - все равно в одну строку.

3. Открываю файл в Екселе, вставляю перенос строки прямо в ячейке, сохраняю файл, открываю в текстовом редакторе:
<Cell ss:StyleID="s30"><Data ss:Type="String">test "& # 10 ;" it</Data></Cell>

"& # 10 ;" - вставил пробелы, иначе не видно в обозревателе

Именно вот этот управляющий символ мне и нужен. В итоге (тема поднималась почти год назад пришлось делать насильную замену переносов строк в классе отчета на "определенную строку" и после формирования итогового xml-файла делать в нем замену "определенной строки" на "& # 10 ;"
__________________
Ivanhoe as is..

Последний раз редактировалось Ivanhoe; 01.12.2008 в 11:52.
Старый 01.12.2008, 11:50   #20  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
А зачем в xml-файле вообще использовать переносы? Для красоты? Я считаю что это вообще лишние символы, которые только увеличивают размер файла.
Цель использования связки xml-Excel - быстрое построение красивых отчетов. На практике делались шаблонные формы (акты, накладные и т.п.), приказы (кадровые), всевозможная отчетность (в том числе с последующим автоматическим построением сводных таблиц).

Если кратко:
1. быстро и удобно разрабатывать новые отчеты (в том числе менять существующие) - программистам хорошо;
2. быстро и красиво формируется документ - хорошо пользователям и их руководителям )
__________________
Ivanhoe as is..
Теги
excel, xml, отчет, форматирование

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dax-lessons: Generate XML Documentation Files for a project - DAX 2009 Blog bot DAX Blogs 0 08.08.2008 19:06
axStart: How to use XSLT in AIF and what’s wrong with empty xml Nodes. Blog bot DAX Blogs 0 27.04.2008 18:07
Inside Dynamics AX 4.0: The XML Structure Blog bot DAX Blogs 0 04.10.2007 11:20
перевод строки - это только 0x0A?? Dymm DAX: Программирование 1 15.03.2006 10:50
перевод строки в radiobutton kitty DAX: Программирование 2 19.07.2005 12:31

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

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

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