26.10.2005, 03:04 | #1 |
Участник
|
Валидация XML файлов в Axapta
Есть проблема с валидацией XML документов с помощью XSD.
PHP код:
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 |
Участник
|
Попробуйте так
xmlSchemaCache.Add("",COMVariant::CreateFromStr(schemaFile)); xmlDoc.com().schemas(COMVariant::CreateFromCOM(xmlSchemaCache));
__________________
Axapta v.3.0 sp5 kr2 |
|
28.03.2006, 12:54 | #3 |
Участник
|
Esli ne sekret, shto eto za metod?
Код: XMLDocument::LK_validate(xmlDoc); |
|
28.03.2006, 20:08 | #4 |
Banned
|
А почему бы Вам не воспользоваться штатными средствами? Сконвертируйте 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 |
Участник
|
Озадачился тойже проблемой, но для AX4.
По поводу проблемы AxDude - там все просто. Все дело в том, что XMLDocument по-умолчанию использует MS XML 3 (см. XMLDocument::XMLDOM()), а в примере попытка использовать XMLSchemaCache.4, что собственно и вызывает ошибку из-за несовместимости. Исправить ситуацию можно, создавая объект XMLDocument так: X++: XMLDocument xmlDoc = xmlNode::construct(new COM('Msxml2.DOMDocument.4.0')); Желание использовать 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 |
Участник
|
XML в 4 сделан поверх System.XML, соответственно можно посмотреть доку в MSDN. Если не хватает обернутых методов, то можно юзать сам неймспейс через интеграцию с .Net
Хотя я непример вижу XMLReader.validate - может его как-то поюзать? |
|
23.01.2008, 18:54 | #7 |
Участник
|
Вот пример нашел тут: 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 |
Участник
|
Спасибо, то что надо.
Резюмирую проверенным, минималистичным, самодостаточным джобиком: 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 |
Участник
|
добавил ваш код в http://erpkb.com/Axapta/XML
|
|
11.12.2008, 19:49 | #10 |
MCTS
|
Похоже, что метод валидации, указанный в "проверенном, минималистичном, самодостаточном джобике" не работает в случае, если в 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 |
Lean Six Sigma
|
Делаем с двумя 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()); } } |
|
|
За это сообщение автора поблагодарили: NeveB (1), belugin (3), alex55 (1), Cardagant (1). |
06.12.2012, 14:03 | #12 |
Участник
|
Добрый день! Подскажите пожалуйста, а в какой версии появились эти классы? У меня в 3-ке их нет, а функционал очень нужен.
Я имею ввиду: XMLTextReader XMLSchema XmlSchemaValidationError |
|
06.12.2012, 14:22 | #13 |
Участник
|
Эти классы из 4-ки и выше.
В 3-ке используйте класс XMLDocument или напрямую через COM как в примере у Ned. |
|
16.08.2013, 22:53 | #14 |
Участник
|
Добрый вечер, уважаемые разработчики) Решил поиграться с валидацией XML документов(нужно было) и наткнулся на интересную ошибку.
Создал джоб, в котором одна строчка кода: X++: Com xm = new Com("MSXML2.XMLSchemaCache.5.0"); Цитата:
COM-объект класса "MSXML2.XMLSchemaCache.5.0" не удалось создать. Убедитесь, что объект был должным образом зарегистрирован на компьютере "AAVOLKOFF".
Пробовал и 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 |
Участник
|
Цитата:
Сообщение от user_ax
X++: Com xm = new Com("MSXML2.XMLSchemaCache.5.0"); |
|
17.08.2013, 12:51 | #16 |
Участник
|
Цитата:
Спасибо! Последний раз редактировалось Cardagant; 17.08.2013 в 12:58. |
|
17.08.2013, 13:56 | #17 |
Участник
|
С точки зрения решения данной конкретной проблемы - скорее всего, да, но с точки зрения администрирования установленных компонент и системы в целом лучше по-нормальному установить Ms Core XML Services 6.0, чтобы к ним приходили обновления, потому что с 2006-го года в них нашли много дыр, вышло несколько SP и заплаток, так что просто зарегистрировав на компе не весть какую версию msxml6.dll, вы рискуете сделать его уязвимым для кучи эксплойтов.
|
|
18.08.2013, 19:18 | #18 |
Участник
|
Скачал, установил 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 |
Участник
|
Очень может быть. У меня для 5.0 и 6.0 прописан один и тот же CLSID {88D969E7-F192-11D4-A65F-0040963251E5}, который указывает на msxml6.dll.
PS. Если в HKCR нет ключа с названием MSXML2.XMLSchemaCache.5.0, то ругаться на попытку создать такой СОМ-объект будет по-любому, так что лучше не упорствовать. |
|
17.10.2013, 10:18 | #20 |
Участник
|
Всем добрый день!
Хочу поднять тему со следующим вопросом, взможно кто-то сталкивался. При использовании следующего кода: 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; При перезарузке Аксапты данная ошибка пропадает. DAX 2009 P.S. Искал информацию по данной ошибке в контексте, указанном выше, ничего полезного не нашёл. Поэтому прошу помощи у вас! Заранее спасибо! Последний раз редактировалось Cardagant; 17.10.2013 в 10:32. |
|
Теги |
ax2009, ax3.0, ax4.0, xml, полезное |
|
Похожие темы | ||||
Тема | Ответов | |||
Axapta & XML | 4 | |||
Проблема с выгрузкой/загрузкой файлов в базу из Axapta в др базу | 1 | |||
Axapta 3, отправка файлов по eMail (КАК ИСПРАВИТЬ) | 1 | |||
XML в Axapta | 4 | |||
Введение в Аксапту | 0 |
|