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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.07.2005, 14:40   #1  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Проблема с сохранением XML
Формирую XML, используя классы XMLDocument и XMLElement .
За пример брал класс InventJournalData_Loss_RU

XML сформировал
PHP код:
<?xml version="1.0"?>
<CUSTTABLE>
 <CUSTINFO ACCOUNTNUM="Boss"
NAME="Boss" 
ADDRESS="xxxxxxxxx"/>
</CUSTTABLE>
Но при попытке сохранить файл cust2XML.createXML().save('C:\ttt.xml');
ругается .:
Цитата:
Метод 'save' в COM-объекте класса 'microsoft.xmldom' возвратил код ошибки 0x80004005 (E_FAIL), который означает: Unable to save character to 'iso-8859-1' encoding.
Из формированного XML видно, что нет аттрибута encoding = xxxx
Но к сожалению, не нашел у класса метода его выставляющего , и на сайте. Подскажите, пожалуйста как обойти проблему..
Старый 28.07.2005, 15:50   #3  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Приведенный Вами пример работает.
А мой нет. =(
Работающий пример
PHP код:
static void XMLTry(Args _args)
{
XMLDocument xmlDoc XMLDocument::newBlank();
XMLElement rootroot2;
XMLAttribute attr1;
XMLNode docElemdocElem2;
XMLProcessingInstruction instruction;
XMLNode node;
;

// root element
root xmlDoc.createNode(XMLNodeType::ELEMENT"persons""");
// inner element
root2 xmlDoc.createNode(XMLNodeType::ELEMENT"person1""");
// attribute
attr1 xmlDoc.createAttribute("attribute1");
root2.setAttribute("test""child");
// assembly
docElem xmlDoc.appendChild(root);
docElem2 docElem.appendChild(root2);
// save
xmlDoc.save("c:\\test.xml");


Мой, не работающий ...
PHP код:

class CustTable2XML {
   
XMLDocument             xmlDocument;
   
XMLElement              xmlRootElement;

   
#CustTable
}

static 
void main (Args _args){
  
XMLDocument  doc;
  
CustTable2XML  cust2XML  = new  CustTable2XML() ;
 ;

  
doc cust2XML.createXML();
  print 
doc.toString();
  
doc.save('c:\\xxx.xml');
}


void new(){
  ;
  
xmlDocument XMLDocument::newBlank();

  
xmlRootElement xmlDocument.createElement(#CUSTTTABLE);
  
xmlDocument.appendChild(xmlRootElement);
}

public 
XMLDocument createXML() {
  
CustTable      CustTable;
  ;
  while  
select firstonly CustTable{
      
this.initCustTable(custtable);
  }
  return 
xmlDocument;
}


private 
void initCustTable(CustTable _custTable) {
  
XMLElement          xmlElement;
  
str Trim (str _value) {
    return  
strrtrim(strltrim(_value));
  }
  ;
  
xmlElement xmlDocument.createElement(#RECORD);
  
xmlElement.setAttribute(#ACCOUNTNUM , trim(_custTable.AccountNum));
  
xmlElement.setAttribute(#NAME       , trim(_custTable.Name));
  
xmlElement.setAttribute(#ADDRESS    , trim(_custTable.Address));

  
xmlRootElement.appendChild(xmlElement);
  } 
P.S причет, если закомментировать строку xmlRootElement.appendChild(xmlElement); в методе initCustTable, то файл создается (без информации о клиентах, конечно. Только заголовок и главный тэг с завершающим признаком, но с encoding )
Старый 28.07.2005, 16:02   #4  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Аксапты у меня нет , так что ничем, к сожалению, помочь пока не могу.

Единственное, что в заголовке XML документа, можно указать кодировку документа. То есть, вместо имющегося:

PHP код:
<?xml version="1.0"?>
постарайся получить:

PHP код:
<?xml version="1.0" encoding="ISO-8859-1"?>
encoding должен быть тот, который тебе нужен.

Как это достигается в Аксапте, к сожалению не помню. Если совсем ни как - смогу посмореть в выходные.
Старый 28.07.2005, 16:05   #5  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Спасибо!
Попробую еще попробовать выставить еncoding "вручную" =)
Если получится - то сообщу, иначе считайте что не справился пока.
Еще раз спасибо.
Старый 28.07.2005, 16:23   #6  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Проблема именно в кодировке. (что в принципе и следовало из сообщения =)) )
Попробовал вместо реальных данных подставить английские буквы - все сохранилось.
Так что вопрос сужается до следующего:
Как выставить в формируемом xml нужную кодировку ?
Старый 28.07.2005, 16:54   #7  
slava is offline
slava
сибиряк
Самостоятельные клиенты AX
 
468 / 23 (1) +++
Регистрация: 28.12.2001
Адрес: Москва
Цитата:
Изначально опубликовано ATimTim

Так что вопрос сужается до следующего:
Как выставить в формируемом xml нужную кодировку ?
Вот кусочек рабочего кода
PHP код:
    XMLDocument                     objDOM ;
    
XMLElement                      elementNode;
    
XMLProcessingInstruction        procInctruction;
;
    
objDOM              = new XMLDocument();
    
elementNode         objDOM.createElement("BranchCompany");

    
textNode            objDOM.createTextNode(branchCompanyTable.BranchCompanyId);
    
elementNode.setAttribute("id"textNode.text());
    
textNode            objDOM.createTextNode(branchCompanyTable.branchCompanyName());
    
elementNode.setAttribute("name"textNode.text());
    
textNode            objDOM.createTextNode(date2str(today(), 123,2,2,2,2,2));
    
elementNode.setAttribute("transferDate"textNode.text());

    
branchCompany       objDOM.appendChild(elementNode);

    
procInctruction     objDOM.createProcessingInstruction("xml""version=\"1.0\" encoding=\"Windows-1251\" ");
    
elementNode         objDOM.insertBefore(procInctruction,
                                              
branchCompany.com()); 
__________________
С уважением, Вячеслав.
Старый 28.07.2005, 16:56   #8  
maximus is offline
maximus
Участник
 
153 / 10 (1) +
Регистрация: 16.03.2005
2ATimTim
Именно аттрибутом encoding и выставить. Зайдите в XMLDocument::newBlank() и найдите строку
PHP код:
    XMLProcessingInstruction    instruction xmlDocument.createProcessingInstruction('xml''version="1.0" encoding="iso-8859-1"'); 
Поменяйте iso-8859-1 на windows-1251 и будет Вам счастье. Наследовать ли XMLDocument, или править в новом слое - решайте сами.
Старый 28.07.2005, 17:19   #9  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Спасибо всем.
Изменил кодировку прямо в классе.
Старый 28.07.2005, 17:22   #10  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
А я бы отнаследовал
Старый 04.08.2005, 14:20   #11  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
А я изменил =)
Старый 04.08.2005, 14:30   #12  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Ну, ваше дело. Хотя про это, кажется, написано в Best Practices и даже есть вопрос такой на экзаменах. Ну, и вообще, отнаследоваться было бы безопаснее Во-первых, может существовать стандартный функционал, написанный с расчетом на получение encoding=1251. Во-вторых, если вам понадобится xml в еще одной (третьей) кодировке - вы опять этот класс править полезете ?
Старый 08.08.2005, 16:07   #13  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Полностью с Вами согласен.
Старый 24.08.2005, 19:53   #14  
st_msav is offline
st_msav
Участник
Аватар для st_msav
 
49 / 14 (1) ++
Регистрация: 24.08.2005
Адрес: Moscow City
Цитата:
Изначально опубликовано slava

Вот кусочек рабочего кода
PHP код:
    XMLDocument                     objDOM ;
    
XMLElement                      elementNode;
    
XMLProcessingInstruction        procInctruction;
;
    
objDOM              = new XMLDocument();
    
elementNode         objDOM.createElement("BranchCompany");

    
textNode            objDOM.createTextNode(branchCompanyTable.BranchCompanyId);
    
elementNode.setAttribute("id"textNode.text());
    
textNode            objDOM.createTextNode(branchCompanyTable.branchCompanyName());
    
elementNode.setAttribute("name"textNode.text());
    
textNode            objDOM.createTextNode(date2str(today(), 123,2,2,2,2,2));
    
elementNode.setAttribute("transferDate"textNode.text());

    
branchCompany       objDOM.appendChild(elementNode);

    
procInctruction     objDOM.createProcessingInstruction("xml""version=\"1.0\" encoding=\"Windows-1251\" ");
    
elementNode         objDOM.insertBefore(procInctruction,
                                              
branchCompany.com()); 
Все конечно замечательно написано, но только заголовок с версией и кодировкой дублируется и сообщение на тему невозможности записи в кодировке не пропадает. Однако, как мне кажется, верным будет создание собственного класса, наследника от XMLDocument.
PHP код:
class XMLDocument_RU extends XMLDocument
{
}

public static 
XMLDocument newBlank()
{
    
COM                         dom         XMLDocument::XMLDOM();
    
xmlDocument                 xmlDocument xmlNode::construct(dom);
    
XMLProcessingInstruction    instruction xmlDocument.createProcessingInstruction('xml''version="1.0" encoding="Windows-1251"');
;
    
xmlDocument.appendChild(instruction);
    return 
xmlDocument;

Вот после этого все стало работать нормально.

Что меня смущает в этом вопросе: неужели до сих пор в стандартной функциональности Axapta не реализовано такого класса. Хотя, я не исключаю, что мне об этом просто не известно. Буду краней признателен за подсказку в этом вопросе, поскольку у меня стойкое ощущение, что мною был только что снова изобретен велосипед.
Старый 24.08.2005, 22:52   #15  
maximus is offline
maximus
Участник
 
153 / 10 (1) +
Регистрация: 16.03.2005
st_msav
Как ощущается в роли Творца? (вопрос риторический) Буржуи они, наплевать им на windows-1251. ИМХО, будет работать и с ISO-8859-1, если ее установить в системе
Старый 25.08.2005, 10:32   #16  
st_msav is offline
st_msav
Участник
Аватар для st_msav
 
49 / 14 (1) ++
Регистрация: 24.08.2005
Адрес: Moscow City
Re: st_msav
Цитата:
Изначально опубликовано maximus
Как ощущается в роли Творца? (вопрос риторический) Буржуи они, наплевать им на windows-1251. ИМХО, будет работать и с ISO-8859-1, если ее установить в системе
А Вы попробуйте в ISO-8859-1 этот файл прочесть, например, из программы написанной на C#. Просто интересно, что Вы там увидите вместо русских букв, если конечно система не выдаст сообщение о найденом недопустимом символе. Собственно, у меня так все и случилось. Так что пришлось написать класс не от хорошей жизни.
Старый 25.08.2005, 10:35   #17  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
можно сначала попробовать document.loadXML("<?xml version=\"1.0\" encoding='windows-1251'?><BranchCompany/>"; а затем уже работать с тем, что получилось
Старый 25.08.2005, 10:45   #18  
st_msav is offline
st_msav
Участник
Аватар для st_msav
 
49 / 14 (1) ++
Регистрация: 24.08.2005
Адрес: Moscow City
Цитата:
Изначально опубликовано belugin
можно сначала попробовать document.loadXML("<?xml version=\"1.0\" encoding='windows-1251'?><BranchCompany/>"; а затем уже работать с тем, что получилось
Хе, так опробавано было с разных строн. В результате, оказалось рентабельнее сделать класс в Аксапте, чем морочить себе голову в Visual Studio. А тем более, что мне еще нужно отсылать XML в виндовой кодировке "наружу".
Старый 25.08.2005, 10:52   #19  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
я имел ввиду:
PHP код:
document.loadXML('<?xml version="1.0" encoding="windows-1251"?><BranchCompany/>');
в аксапте
Старый 25.08.2005, 10:56   #20  
st_msav is offline
st_msav
Участник
Аватар для st_msav
 
49 / 14 (1) ++
Регистрация: 24.08.2005
Адрес: Moscow City
Я может чего не понимаю, но при чем тут запись документа в определенной кодировке и метод loadXML?! Мне, например, нужно не читать 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
Проблема с сохранением XML документа DreamCreator DAX: Программирование 3 30.11.2007 17:12
Inside Dynamics AX 4.0: The XML Structure Blog bot DAX Blogs 0 04.10.2007 11:20
проблема с аксаптным XML demcn DAX: Программирование 1 19.05.2004 07:18

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

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

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