17.10.2013, 11:52 | #21 |
Участник
|
Где выполняется код? на клиенте или на сервере?
__________________
// no comments |
|
17.10.2013, 12:22 | #22 |
Участник
|
В 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 |
Участник
|
|
|
17.10.2013, 13:54 | #24 |
Участник
|
Цитата:
Сообщение от plumbum
В AX2009 есть ссылка на сборку System.Xml, попробуйте переписать Ваш код на .NET:
System.Xml.XmlSchemaSet заменит xs, System.Xml.XmlDocument соответственно xd. Используйте XmlDocument.Validate() вместо parseError. После этого вы можете отловить все исключения в блоке try catch с помощью типа исключения CLRError. .NET как по мне работает стабильнее и нагляднее (не нужно в имени объекта указывать версию MS XML), чем вызов COM объектов напрямую. У пользователя возникает ошибка? А можно этот код выполнять на сервере? Можно попробовать переписать валидацию на сервере. Для информации, чем это может помочь? Ошибка вываливается периодически и сложно её отловить... |
|
17.10.2013, 14:04 | #25 |
Участник
|
Цитата:
Вы писали, что ошибка пропадает после перезагрузки Аксапты. Возникает ли она потом снова в процессе работы: например, если вы попробуете в той же сессии проверить тот же файл снова. Я думаю, что если для всех пользователей код будет выполнятся на сервере, это будет стабильнее. По сути дела, вам надо только проверить файлы согласно данной схеме.
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
|
За это сообщение автора поблагодарили: Cardagant (1). |
17.10.2013, 14:28 | #26 |
Участник
|
Возможно в этом и проблема. Не у каждого пользователя настроены права. А на сервере должно быть все в ажуре. Попробуйте создать серверный класс и в него запихнуть такую же логику для теста. Если будут возникать аналогичные проблемы, попробуйте то, что посоветовал вам plumbum
__________________
// no comments |
|
|
За это сообщение автора поблагодарили: Cardagant (1). |
17.10.2013, 14:35 | #27 |
Участник
|
Нет. Я не так давно работаю с XML, решил воспользоваться приведённым в теме примером.
Цитата:
Сообщение от plumbum
Вы писали, что ошибка пропадает после перезагрузки Аксапты. Возникает ли она потом снова в процессе работы: например, если вы попробуете в той же сессии проверить тот же файл снова. Я думаю, что если для всех пользователей код будет выполнятся на сервере, это будет стабильнее. По сути дела, вам надо только проверить файлы согласно данной схеме.
Хочу спросить о .Net. Метод XmlDocument.Validate() возращает Void и требует в параметры некий ValidationEventHandler. Что это? Не могу его найти. И как мне правильн осчитать ошибку при её возникновении? Буду признателен за ответ! UPD: И я так понимаю, нужен .Net не менее версии 3.5. Последний раз редактировалось Cardagant; 17.10.2013 в 14:52. |
|
17.10.2013, 16:09 | #28 |
Участник
|
Прочитав 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.
Приведу общий код обработки исключений для .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 |
Участник
|
Спасибо за полезные примеры!
Однако Load'ы не проверяют файл по схемам. Буду искать дальше. Спасибо! |
|
17.10.2013, 20:41 | #30 |
Участник
|
Цитата:
Однако Load'ы не проверяют файл по схемам. Буду искать дальше. Спасибо!
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(); } Цитата:
XmlSchemaValidationException: A schema validation event occurred and no ValidationEventHandler object was specified.
Я к сожалению не могу сейчас проверить это. Напишите, если Вам удасться.
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
18.10.2013, 10:04 | #31 |
Участник
|
Спасибо за пример!
Ругается на метод Validate() с ошибкой: "Класс System.Xml.XmlDocument не содержит эту функцию." Хоть в выпадающем списке методов он есть. Как такое может быть? |
|
18.10.2013, 11:16 | #32 |
Ищущий знания...
|
Цитата:
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 |
Участник
|
Цитата:
Хоть в выпадающем списке методов он есть. Как такое может быть?
Наверное самый надежный способ привел lev. Через AX классы, как и через .NET будут дергаться все те же COM компоненты MS Core XML Services.
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
18.10.2013, 12:17 | #34 |
Участник
|
2lev
Спасибо! Знаю такой способ. Но мне нужно производить валидацию сразу по нескольким схемам. Стандартные классы этого не позволяют. Если взглянете на код в сообщениях выше, то сможете увидеть X++: xs.Add('xmln', 'schemaPath1.xsd'); xs.Add('xmln', 'schemaPath2.xsd'); Последний раз редактировалось Cardagant; 18.10.2013 в 12:19. |
|
18.10.2013, 13:28 | #35 |
Ищущий знания...
|
Цитата:
Сообщение от Cardagant
2lev
Спасибо! Знаю такой способ. Но мне нужно производить валидацию сразу по нескольким схемам. Стандартные классы этого не позволяют. Если взглянете на код в сообщениях выше, то сможете увидеть X++: xs.Add('xmln', 'schemaPath1.xsd'); xs.Add('xmln', 'schemaPath2.xsd');
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
18.10.2013, 13:38 | #36 |
Участник
|
Цитата:
Если цитировать одно из предыдущих сообщений темы: Цитата:
не работает в случае, если в XSD-схеме используется импорт из другой схемы, содержащей другое пространство имен
|
|
19.10.2013, 02:14 | #37 |
Участник
|
Предложу свой вариант, работает на 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 |
Участник
|
2handy-comp
Спасибо за Ваш вариант! А что должно быть в цикле While? |
|
19.10.2013, 13:48 | #39 |
Участник
|
|
|
20.10.2013, 01:05 | #40 |
Участник
|
|
|
Теги |
ax2009, ax3.0, ax4.0, xml, полезное |
|
Похожие темы | ||||
Тема | Ответов | |||
Axapta & XML | 4 | |||
Проблема с выгрузкой/загрузкой файлов в базу из Axapta в др базу | 1 | |||
Axapta 3, отправка файлов по eMail (КАК ИСПРАВИТЬ) | 1 | |||
XML в Axapta | 4 | |||
Введение в Аксапту | 0 |
|