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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.10.2005, 03:04   #1  
AxDude is offline
AxDude
Участник
 
18 / 10 (1) +
Регистрация: 04.03.2005
Адрес: USA, Cincinnati, Ohio.
Валидация XML файлов в Axapta
Есть проблема с валидацией XML документов с помощью XSD.

PHP код:
Server static void loadAndValidateDoc(str dataFilestr schemaFile)
{
    
XMLDocument xmlDoc XMLDocument::newBlank();
    
COM xmlSchemaCache = new COM("Msxml2.XMLSchemaCache.4.0");
    ;
    
xmlSchemaCache.Add("",schemaFile);
    
xmlDoc.com().schemas(xmlSchemaCache);     //здесь вываливается
    
xmlDoc.async(false);
    
xmlDoc.validateOnParse(true);
    
xmlDoc.loadXML(dataFile);
    
XMLDocument::LK_validate(xmlDoc);

Ошибка выскакивает в строке xmlDoc.com() schemas(xmlSchemaCache)
Error: Method 'Schemas' in COM object of class 'microsoft.xmldom' returned error code
0x80004005 (E_FAL) which means: Only XMLSchemaCache schema collections can be used.

Может, надо что-то установить дополнительно? Если у кого-нибудь есть работающие примеры XML-валидации в Аксапте, буду очень благодарен.

Старый 26.10.2005, 08:53   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Попробуйте так

xmlSchemaCache.Add("",COMVariant::CreateFromStr(schemaFile));
xmlDoc.com().schemas(COMVariant::CreateFromCOM(xmlSchemaCache));
__________________
Axapta v.3.0 sp5 kr2
Старый 28.03.2006, 12:54   #3  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Esli ne sekret, shto eto za metod?

Код:
XMLDocument::LK_validate(xmlDoc);
Старый 28.03.2006, 20:08   #4  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
А почему бы Вам не воспользоваться штатными средствами? Сконвертируйте XSD в XDR с помощью, скажем, BizTalk Editor и воспользуйтесь методом \Classes\XMLDocument\newDocInlineSchema. (Внимание! Не работает с MSXML 4.0!)

P.S. Сегодня обнаружил, что с помощью BizTalk Editor из XSD XDR сделать нельзя. По той причине, что XSD - полнее и сложнее. Можно попробовать с программой xmlSpy.

Последний раз редактировалось EVGL; 29.03.2006 в 16:51.
Старый 23.01.2008, 18:13   #5  
leva is offline
leva
Участник
 
52 / 36 (2) +++
Регистрация: 03.08.2005
Озадачился тойже проблемой, но для AX4.

По поводу проблемы AxDude - там все просто. Все дело в том, что XMLDocument по-умолчанию использует MS XML 3 (см. XMLDocument::XMLDOM()), а в примере попытка использовать XMLSchemaCache.4, что собственно и вызывает ошибку из-за несовместимости. Исправить ситуацию можно, создавая объект XMLDocument так:

X++:
XMLDocument xmlDoc = xmlNode::construct(new COM('Msxml2.DOMDocument.4.0'));
Да и еще... там по логике вместо loadXML должно быть load

Желание использовать MS XML 4 понятно - начиная с него появляется поддержка XSD. А начиная с 6 исчезает поддержка XDR (ибо умерло).


Я начал делать тоже в AX4, но оказалось там все классы связанные с XML скрыты и многие методы убраны, в том числе com(). MS XML там используется предположительно >=4. Как произвести валидацию так и не понял, хотя там и появился и вроде работает класс XMLSchema, но как их "связать" не нашел.

Насколько я понял в 4-ке вся работа с XML вынесена в AIF и соотетственно классы Ax* и напрямую с XML-классами работать не рекомендуется.

В Ax-классах пока тоже не нашел валидацию, направьте на верный путь.
Старый 23.01.2008, 18:53   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
XML в 4 сделан поверх System.XML, соответственно можно посмотреть доку в MSDN. Если не хватает обернутых методов, то можно юзать сам неймспейс через интеграцию с .Net

Хотя я непример вижу XMLReader.validate - может его как-то поюзать?
Старый 23.01.2008, 18:54   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Вот пример нашел тут: AxPath://AOT/Forms/AifXsltRepository...importFromFile

X++:
        // Open the file, get encoding.
        textReader = XmlTextReader::newFile(filename);
        textReader.read();
        encoding = System.Text.Encoding::GetEncoding(textReader.encoding());

        // Validate against schema.
        textReader.moveToContent();
        validationError = textReader.validate(this.getSchema());
        textReader.close();
За это сообщение автора поблагодарили: leva (1).
Старый 24.01.2008, 12:12   #8  
leva is offline
leva
Участник
 
52 / 36 (2) +++
Регистрация: 03.08.2005
Спасибо, то что надо.

Резюмирую проверенным, минималистичным, самодостаточным джобиком:

X++:
static void XMLValidate(Args _args)
{
    XMLTextReader               xmlReader = XMLTextReader::newFile(@"C:\somepath\file.xml");
    XMLSchema                   xmlSchema = XMLSchema::newFile(@'C:\1\somepath\schema.xsd');
    XmlSchemaValidationError    validationError;
    ;

    xmlReader.read();
    xmlSchema.compile();

    if (! xmlSchema.isCompiled())
        throw error(xmlSchema.validationError().message());

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

    if (validationError)
        throw error(validationError.message());
}
За это сообщение автора поблагодарили: mazzy (5), belugin (2), Denicce (1), Stainless (1), alex55 (1).
Старый 24.01.2008, 12:16   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
добавил ваш код в http://erpkb.com/Axapta/XML
Старый 11.12.2008, 19:49   #10  
alex55 is offline
alex55
MCTS
MCBMSS
 
224 / 145 (5) +++++
Регистрация: 13.02.2007
Адрес: Москва
Похоже, что метод валидации, указанный в "проверенном, минималистичном, самодостаточном джобике" не работает в случае, если в XSD-схеме используется импорт из другой схемы, содержащей другое пространство имен, пример:

X++:
<!-- Common.xsd >>  -->
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" targetNamespace="urn:Common" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="urn:Common">

<xs:complexType name="Document">
	<xs:sequence>
		<xs:element minOccurs="1" name="Number" nillable="false" type="xs:string" />
		<xs:element maxOccurs="1" name="Date" nillable="false" type="xs:dateTime" />
	</xs:sequence>
</xs:complexType>

</xs:schema>
<!-- << Common.xsd -->

<!-- Test1.xsd >>  -->
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" targetNamespace="urn:Test1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="urn:Test1">

	<xs:import schemaLocation="Common.xsd" namespace="urn:Common" /> 

<xs:complexType name="OrderType" >
	<xs:complexContent mixed="false">
		<xs:extension base="i1:Document" xmlns:i1="urn:Common" >
			<xs:sequence>
				<xs:element minOccurs="1" name="Qtv" nillable="false" type="xs:int" />
			</xs:sequence>
		</xs:extension>
	</xs:complexContent>
</xs:complexType>
<xs:element name="Order" nillable="true" type="tns:OrderType" />
</xs:schema>
<!-- << Test1.xsd -->

<!-- Test1.xml >>  -->
<?xml version="1.0" encoding="utf-8" ?>
<ex:Order xmlns:ex="urn:Test1" xmlns:vt="urn:Common">
	<vt:Number>134</vt:Number>
	<vt:Date>2007-05-22T11:33:33</vt:Date>
	<ex:Qtv>44</ex:Qtv>
</ex:Order>
<!-- << Test1.xml -->
Есть ли мысли, как можно корректно провести валидацию в данном случае?

Upd: при попытке валидации ругается так:
X++:
"В качестве базы для расширения составного типа используется неопределенный complexType 'urn:Common:Document'."

Последний раз редактировалось alex55; 11.12.2008 в 19:54.
Старый 03.02.2009, 03:10   #11  
Ned is offline
Ned
Lean Six Sigma
 
680 / 99 (5) ++++
Регистрация: 29.12.2002
Адрес: самолёт
Делаем с двумя XSD:

X++:
#define.xml('H:\\XML\\test1.xml')
#define.xsd1('urn:Test1','H:\\XML\\test1.xsd')
#define.xsd2('urn:Common','H:\\XML\\Common.xsd')
void validateFile()
{
    COM         xs = New COM("MSXML2.XMLSchemaCache.5.0");
    COM         xd = New COM("MSXML2.DOMDocument.5.0");
    COM         er;
    counter     i;
    ;
    xs.Add(#xsd1);
    xs.Add(#xsd2);
    xd.schemas(xs);
    xd.async(false);
    xd.Load(#xml);
    er = xd.parseError();
    if (er.errorCode())
    {
        throw error("Validation failed on " +
             #xml + @"
             =====================
             Reason: " + any2str(er.reason()) + @"
             Source: " + er.srcText() + @"
             Line: " + int2str(er.Line()));
    }
    else
    {
        info("Validation succeeded for " + #xml + @"
             ======================
             " + xd.xml());
    }
}
__________________
Viacheslav Nefedov, http://www.nefedov.net, http://restock.guru/
За это сообщение автора поблагодарили: NeveB (1), belugin (3), alex55 (1), Cardagant (1).
Старый 06.12.2012, 14:03   #12  
Andy-k is offline
Andy-k
Участник
Аватар для Andy-k
 
23 / 10 (1) +
Регистрация: 29.08.2012
Адрес: Москва
Добрый день! Подскажите пожалуйста, а в какой версии появились эти классы? У меня в 3-ке их нет, а функционал очень нужен.

Я имею ввиду:

XMLTextReader
XMLSchema
XmlSchemaValidationError
Старый 06.12.2012, 14:22   #13  
leva is offline
leva
Участник
 
52 / 36 (2) +++
Регистрация: 03.08.2005
Эти классы из 4-ки и выше.
В 3-ке используйте класс XMLDocument или напрямую через COM как в примере у Ned.
Старый 16.08.2013, 22:53   #14  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Добрый вечер, уважаемые разработчики) Решил поиграться с валидацией XML документов(нужно было) и наткнулся на интересную ошибку.

Создал джоб, в котором одна строчка кода:

X++:
Com xm = new Com("MSXML2.XMLSchemaCache.5.0");
При запуске получил ошибку:

Цитата:
COM-объект класса "MSXML2.XMLSchemaCache.5.0" не удалось создать. Убедитесь, что объект был должным образом зарегистрирован на компьютере "AAVOLKOFF".
Первым делом полез в реестр, чтобы узнать, если ли вообще на моей машине то, что нужно. Нашёл раздел, в котором был атрибут XMLSchemaCache, но без цифр, посмотрел, откуда он берёт dll-ку, и решил её перерегистрировать командой regsvr32 msxml3.dll. Команда отработала, однако ошибка не пропала...
Пробовал и 4 версию кеша и 5 - ошибка одна и та же.
Если у кого-то есть идеи - подскажите, пожалуйста, натолкните на путь истинный

Заметил особенность, если создавать объект НЕ 5 версии - он создаётся, тобиж так

X++:
  COM         xm   = new COM("MSXML2.XMLSchemaCache");

При этом, у моего коллеки, у которого стоит точно такая же Windows, как и у меня, запускается с 5.0

Последний раз редактировалось user_ax; 16.08.2013 в 23:04.
Старый 17.08.2013, 10:30   #15  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от user_ax Посмотреть сообщение
X++:
Com xm = new Com("MSXML2.XMLSchemaCache.5.0");
При запуске получил ошибку. Первым делом полез в реестр, чтобы узнать, если ли вообще на моей машине то, что нужно. Нашёл раздел, в котором был атрибут XMLSchemaCache, но без цифр. Пробовал и 4 версию кеша и 5 - ошибка одна и та же.
В разделе реестра HKCR\MSXML2.XMLSchemaCache прописан CLSID {373984C9-B845-449B-91E7-45AC83036ADE}, который указывает на msxml3.dll, а для HKCR\MSXML2.XMLSchemaCache.5.0 прописан CLSID {88D969E7-F192-11D4-A65F-0040963251E5}, который указывает на msxml6.dll. Делайте выводы.
Старый 17.08.2013, 12:51   #16  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от gl00mie Посмотреть сообщение
В разделе реестра HKCR\MSXML2.XMLSchemaCache прописан CLSID {373984C9-B845-449B-91E7-45AC83036ADE}, который указывает на msxml3.dll, а для HKCR\MSXML2.XMLSchemaCache.5.0 прописан CLSID {88D969E7-F192-11D4-A65F-0040963251E5}, который указывает на msxml6.dll. Делайте выводы.
Достаточно ли будет зарегистрировать (перерегистрировать) msxml6.dll на данном компьютере, чтоб заработал MSXML2.XMLSchemaCache.5.0?
Спасибо!

Последний раз редактировалось Cardagant; 17.08.2013 в 12:58.
Старый 17.08.2013, 13:56   #17  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
С точки зрения решения данной конкретной проблемы - скорее всего, да, но с точки зрения администрирования установленных компонент и системы в целом лучше по-нормальному установить Ms Core XML Services 6.0, чтобы к ним приходили обновления, потому что с 2006-го года в них нашли много дыр, вышло несколько SP и заплаток, так что просто зарегистрировав на компе не весть какую версию msxml6.dll, вы рискуете сделать его уязвимым для кучи эксплойтов.
Старый 18.08.2013, 19:18   #18  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Скачал, установил msxml6 и msxml6_SDK, в реестре как были папочки Msxml2.XMLSchemaCache.3.0, Msxml2.XMLSchemaCache.6.0 так и остались.

При попытке создать объект
X++:
COM        xs = new COM("MSXML2.XMLSchemaCache.5.0");
Всё равно ругается.
А если создать объект 6.0 - всё отрабатывает.

Есть предположение, что 5.0 ставится вместе с Офисом 2003, но это как предположение.
Старый 18.08.2013, 23:47   #19  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Очень может быть. У меня для 5.0 и 6.0 прописан один и тот же CLSID {88D969E7-F192-11D4-A65F-0040963251E5}, который указывает на msxml6.dll.

PS. Если в HKCR нет ключа с названием MSXML2.XMLSchemaCache.5.0, то ругаться на попытку создать такой СОМ-объект будет по-любому, так что лучше не упорствовать.
Старый 17.10.2013, 10:18   #20  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Всем добрый день!

Хочу поднять тему со следующим вопросом, взможно кто-то сталкивался.

При использовании следующего кода:

X++:
    boolean ret = true;

    COM         xs = new COM("MSXML2.XMLSchemaCache.6.0");
    COM         xd = new COM("MSXML2.DOMDocument.6.0");
    COM         er;

    #define.xml(filename)    
    ;

    xs.add('schemaPath1.xsd');
    xs.add('schemaPath2.xsd');
    xs.add('schemaPath3.xsd');
   
    xd.schemas(xs);
    xd.async(false);
    xd.load(#xml);
    er = xd.parseError();
    if (er.errorCode())
    {
        throw error("Validation failed on " +
             #xml + @"
             =====================
             Reason: " + any2str(er.reason()) + @"
             Source: " + er.srcText() + @"
             Line: " + int2str(er.line()));
    }

    return ret;
у пользователя периодически вылетает ошибка "Метод "add" COM-объекта класса MSXML2.XMLSchemaCache.6.0 возвратил код ошибки 0x80070525 (<неизвестно>), который означает: Учётная запись не существует."
При перезарузке Аксапты данная ошибка пропадает.
DAX 2009

P.S. Искал информацию по данной ошибке в контексте, указанном выше, ничего полезного не нашёл. Поэтому прошу помощи у вас! Заранее спасибо!

Последний раз редактировалось Cardagant; 17.10.2013 в 10:32.
Теги
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, время: 16:43.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.