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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.10.2013, 11:52   #21  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Где выполняется код? на клиенте или на сервере?
__________________
// no comments
Старый 17.10.2013, 12:22   #22  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
В AX2009 есть ссылка на сборку System.Xml, попробуйте переписать Ваш код на .NET:

System.Xml.XmlSchemaSet заменит xs, System.Xml.XmlDocument соответственно xd. Используйте XmlDocument.Validate() вместо parseError. После этого вы можете отловить все исключения в блоке try catch с помощью типа исключения CLRError. .NET как по мне работает стабильнее и нагляднее (не нужно в имени объекта указывать версию MS XML), чем вызов COM объектов напрямую.

У пользователя возникает ошибка? А можно этот код выполнять на сервере?
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!

Последний раз редактировалось plumbum; 17.10.2013 в 12:48.
Старый 17.10.2013, 13:50   #23  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от dech Посмотреть сообщение
Где выполняется код? на клиенте или на сервере?
Данный код выполняется на клиенте.
Старый 17.10.2013, 13:54   #24  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от plumbum Посмотреть сообщение
В AX2009 есть ссылка на сборку System.Xml, попробуйте переписать Ваш код на .NET:

System.Xml.XmlSchemaSet заменит xs, System.Xml.XmlDocument соответственно xd. Используйте XmlDocument.Validate() вместо parseError. После этого вы можете отловить все исключения в блоке try catch с помощью типа исключения CLRError. .NET как по мне работает стабильнее и нагляднее (не нужно в имени объекта указывать версию MS XML), чем вызов COM объектов напрямую.

У пользователя возникает ошибка? А можно этот код выполнять на сервере?
Насчёт того, что понятнее, возможно. Но ведь используются одни и те же объекты как COM, так и .Net. Просто в COM я могу указать какой именно использовать по имени, к примеру. Или я неправ?

Можно попробовать переписать валидацию на сервере. Для информации, чем это может помочь?
Ошибка вываливается периодически и сложно её отловить...
Старый 17.10.2013, 14:04   #25  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Насчёт того, что понятнее, возможно. Но ведь используются одни и те же объекты как COM, так и .Net. Просто в COM я могу указать какой именно использовать по имени, к примеру. Или я неправ?
Правы, а вам надо выбирать отличную от последней версию?

Цитата:
Сообщение от Cardagant Посмотреть сообщение
Можно попробовать переписать валидацию на сервере. Для информации, чем это может помочь?
Ошибка вываливается периодически и сложно её отловить...
Вы писали, что ошибка пропадает после перезагрузки Аксапты. Возникает ли она потом снова в процессе работы: например, если вы попробуете в той же сессии проверить тот же файл снова. Я думаю, что если для всех пользователей код будет выполнятся на сервере, это будет стабильнее. По сути дела, вам надо только проверить файлы согласно данной схеме.
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
За это сообщение автора поблагодарили: Cardagant (1).
Старый 17.10.2013, 14:28   #26  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Данный код выполняется на клиенте.
Возможно в этом и проблема. Не у каждого пользователя настроены права. А на сервере должно быть все в ажуре. Попробуйте создать серверный класс и в него запихнуть такую же логику для теста. Если будут возникать аналогичные проблемы, попробуйте то, что посоветовал вам plumbum
__________________
// no comments
За это сообщение автора поблагодарили: Cardagant (1).
Старый 17.10.2013, 14:35   #27  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от plumbum Посмотреть сообщение
Правы, а вам надо выбирать отличную от последней версию?
Нет. Я не так давно работаю с XML, решил воспользоваться приведённым в теме примером.

Цитата:
Сообщение от plumbum Посмотреть сообщение
Вы писали, что ошибка пропадает после перезагрузки Аксапты. Возникает ли она потом снова в процессе работы: например, если вы попробуете в той же сессии проверить тот же файл снова. Я думаю, что если для всех пользователей код будет выполнятся на сервере, это будет стабильнее. По сути дела, вам надо только проверить файлы согласно данной схеме.
Да, проблема устраняется при перезагрузке Аксапты и в последствии возникает снова через некоторое время (от часа до нескольких дней). Один и тот же файл в одной и той же сессии не проверял.

Хочу спросить о .Net.

Метод XmlDocument.Validate() возращает Void и требует в параметры некий ValidationEventHandler. Что это? Не могу его найти. И как мне правильн осчитать ошибку при её возникновении? Буду признателен за ответ!

UPD: И я так понимаю, нужен .Net не менее версии 3.5.

Последний раз редактировалось Cardagant; 17.10.2013 в 14:52.
Старый 17.10.2013, 16:09   #28  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Прочитав MSDN я понял, что вам и валидацию вызывать не надо:
http://msdn.microsoft.com/en-us/libr...t.loadxml.aspx
http://msdn.microsoft.com/en-us/library/875kz807.aspx

Цитата:
XmlException. There is a load or parse error in the XML. In this case, the document remains empty.
просто проверьте потом тип исключения на XmlException (вхождение в строку текста исключения например)

Приведу общий код обработки исключений для .NET в AX:

X++:
    try
    {
        lclsInteropPerm = new InteropPermission(InteropKind::ClrInterop);
        lclsInteropPerm.assert();

        ....

        CodeAccessPermission::revertAssert();
    }
    catch (Exception::CLRError)
    {
        this.processCLRException();

	CodeAccessPermission::revertAssert();
    }
X++:
protected void processCLRException()
{
    System.Exception            lclsNetException;
    str                         lstrExceptionMessage, lstrErrorMessage;
    InteropPermission           lclsInteropPerm = new InteropPermission(InteropKind::ClrInterop);

    lclsInteropPerm.assert();
    lclsNetException        = CLRInterop::getLastException();

    while (! CLRInterop::isNull(lclsNetException))
    {
        lstrExceptionMessage = lclsNetException.get_Message();
        lstrErrorMessage     += lstrErrorMessage
                                ? "\n" + lstrExceptionMessage
                                : lstrExceptionMessage;
        lclsNetException   = lclsNetException.get_InnerException();
    }

    CodeAccessPermission::revertAssert();
}
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 17.10.2013, 17:59   #29  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Спасибо за полезные примеры!

Однако Load'ы не проверяют файл по схемам. Буду искать дальше. Спасибо!
Старый 17.10.2013, 20:41   #30  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Цитата:
Однако Load'ы не проверяют файл по схемам. Буду искать дальше. Спасибо!
Ну так пишет MS. Возможно этого и недостаточно. А Вы проверили и не получили исключения? Вот примерный вариант вашего кода на .NET с использованием метода Validate:

X++:
    System.Xml.XmlDocument                  xd;        
    System.Xml.Schema.XmlSchemaSet          xs; 
    CLRObject                               validationEventHandler; //not initialized, always null
    InteropPermission                       interopPerm;
    
    
    #define.xml('filename')    
    ;
    try
    {
        xd                      = new System.Xml.XmlDocument();        
        xs                      = new System.Xml.Schema.XmlSchemaSet();        
        
        xs.Add('xmln', 'schemaPath1.xsd');
        xs.Add('xmln', 'schemaPath2.xsd');
    
        xd.set_Schemas(xs);   
        
        xd.Load(#xml);
    
        xd.Validate(validationEventHandler);                
    }
    catch (Exception::CLRError)
    {
        this.processCLRException();
    }
вот что написано про метод Validate вот тут:
Цитата:
XmlSchemaValidationException: A schema validation event occurred and no ValidationEventHandler object was specified.
По ссылке вы также найдете пример, где в метод передается делегат для обработки исключений. Это делается с целью прохода всего документа, однако, если вы не укажете делегат, то исключение будет сгенерированно на первой же ошибке.

Я к сожалению не могу сейчас проверить это. Напишите, если Вам удасться.
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 18.10.2013, 10:04   #31  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Спасибо за пример!

Ругается на метод Validate() с ошибкой:
"Класс System.Xml.XmlDocument не содержит эту функцию."
Хоть в выпадающем списке методов он есть. Как такое может быть?
Старый 18.10.2013, 11:16   #32  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Спасибо за пример!

Ругается на метод Validate() с ошибкой:
"Класс System.Xml.XmlDocument не содержит эту функцию."
Хоть в выпадающем списке методов он есть. Как такое может быть?
Вот код, который работает в четверке. Проверяет валидность xml файла схеме (xsd файла):
X++:
    XMLTextReader                   xmlReader; // системный класс ядра
    XMLSchema                         xmlSchema; // системный класс ядра
    XmlSchemaValidationError    validationError; // системный класс ядра
    boolean                               ret = true;
    ;
    if (!WinApi::fileExists(shemaName))
    {
        ret = checkfailed(strfmt("Не найден файл \"%1\"", shemaName));
        return ret;
    }

    new FileIOPermission(shemaName, 'r').assert();
    xmlSchema = XMLSchema::newFile(shemaName);
    xmlSchema.compile();
    CodeAccessPermission::revertAssert();

    if (! xmlSchema.isCompiled())
    {
        ret = checkfailed(xmlSchema.validationError().message());
        return ret;
    }

    new FileIOPermission(fileName, 'r').assert();
    xmlReader = XMLTextReader::newFile(fileName);
    xmlReader.read();
    CodeAccessPermission::revertAssert();

    validationError = xmlReader.validate(xmlSchema.writeToString());

    if (validationError)
    {
        ret = checkfailed(validationError.message());
    }

    return ret;
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: plumbum (1), Cardagant (1), A_BAS (1).
Старый 18.10.2013, 11:44   #33  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Цитата:
Хоть в выпадающем списке методов он есть. Как такое может быть?
Мне кажется, это связано с установленными версиями MS Core XML Services.

Наверное самый надежный способ привел lev. Через AX классы, как и через .NET будут дергаться все те же COM компоненты MS Core XML Services.
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 18.10.2013, 12:17   #34  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
2lev

Спасибо! Знаю такой способ.
Но мне нужно производить валидацию сразу по нескольким схемам. Стандартные классы этого не позволяют.

Если взглянете на код в сообщениях выше, то сможете увидеть
X++:
xs.Add('xmln', 'schemaPath1.xsd');
xs.Add('xmln', 'schemaPath2.xsd');
А у меня таких схем больше двух

Последний раз редактировалось Cardagant; 18.10.2013 в 12:19.
Старый 18.10.2013, 13:28   #35  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Cardagant Посмотреть сообщение
2lev

Спасибо! Знаю такой способ.
Но мне нужно производить валидацию сразу по нескольким схемам. Стандартные классы этого не позволяют.

Если взглянете на код в сообщениях выше, то сможете увидеть
X++:
xs.Add('xmln', 'schemaPath1.xsd');
xs.Add('xmln', 'schemaPath2.xsd');
А у меня таких схем больше двух
Я правильно понял, что один xml файл должен провериться на соответствие нескольким схемам?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 18.10.2013, 13:38   #36  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от lev Посмотреть сообщение
Я правильно понял, что один xml файл должен провериться на соответствие нескольким схемам?
Да, Вы поняли верно. Причём схемы имеют зависимости между собой.

Если цитировать одно из предыдущих сообщений темы:
Цитата:
не работает в случае, если в XSD-схеме используется импорт из другой схемы, содержащей другое пространство имен
Старый 19.10.2013, 02:14   #37  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Предложу свой вариант, работает на DAX 2009, но не пробовал с несколькими схемами, думаю должно работать, если нет, выложите плиз свои тестовые данные.

X++:
    System.Xml.XmlReaderSettings    xmlReaderSettings;
    System.Xml.Schema.XmlSchemaSet  xmlSchemaSet;
    System.Xml.XmlReader            xmlReader;
    ;
    
    try
    {
        xmlSchemaSet = new System.Xml.Schema.XmlSchemaSet();
        xmlSchemaSet.Add('', @'schemaPath1.xsd');
        xmlSchemaSet.Add('', @'schemaPath2.xsd');
        xmlReaderSettings = new System.Xml.XmlReaderSettings();
        xmlReaderSettings.set_ValidationType(System.Xml.ValidationType::Schema);
        xmlReaderSettings.set_Schemas(xmlSchemaSet);
        xmlReader = System.Xml.XmlReader::Create(@'fileName.xml', xmlReaderSettings);
        while(xmlReader.Read())
        {
            //
        }
        info("Ok");
    }
    catch( Exception::CLRError)
    {
        error(strFmt("Validation error: %1", AifUtil::getClrErrorMessage()));
    }
    if(!CLRInterop::isNull(xmlReader))
    {
        xmlReader.Close();
    }

Последний раз редактировалось handy-comp; 19.10.2013 в 02:19.
За это сообщение автора поблагодарили: trud (2), plumbum (1), Cardagant (1), A_BAS (1).
Старый 19.10.2013, 12:40   #38  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
2handy-comp

Спасибо за Ваш вариант!
А что должно быть в цикле While?
Старый 19.10.2013, 13:48   #39  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Цитата:
Сообщение от Cardagant Посмотреть сообщение
2handy-comp

Спасибо за Ваш вариант!
А что должно быть в цикле While?
Ничего, все как указано, только свои файлы пропишите.
Старый 20.10.2013, 01:05   #40  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от handy-comp Посмотреть сообщение
Ничего, все как указано, только свои файлы пропишите.
Ваша версия кода для валидации XML-файлов работает!

Благодарю Вас за пример!
Теги
ax2009, ax3.0, ax4.0, xml, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Axapta & XML dj_Mage DAX: Программирование 4 11.08.2006 12:42
Проблема с выгрузкой/загрузкой файлов в базу из Axapta в др базу Jony DAX: Программирование 1 29.09.2004 15:20
Axapta 3, отправка файлов по eMail (КАК ИСПРАВИТЬ) raz DAX: Программирование 1 01.10.2003 15:07
XML в Axapta axot DAX: Программирование 4 01.11.2002 11:37
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:17.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.