кажется, это был бы общий вопрос, хотя я не мог найти его на SO.
какую версию MSXML я должен использовать в своих приложениях, и что более важно, как я должен решить?
есть MSXML3, 4, 5 и 6.
недавно я опубликовал код в вызов-wcf-service-by-vbscript который использовал MSXML v4. AnthonyWJones опубликовал, что я не должен использовать 4, а вместо 3 или 6, но, вероятно, 3. Конечно, не v5!
Почему? Я хотел бы узнать больше о критериях выбора версии MSXML для использования в моих приложениях.
дополнительный вопрос: есть ли у кого-нибудь резюме различий между различными версиями MSXML с течением времени?
резюме до сих пор:
- службы msxml6
Должен быть первый выбор. был выпущен в 2006 году и включает исправления perf и соответствия. Используй это, если сможешь. Это хорошо. Нет объединить модули; для связывания среды выполнения MSXML6 с вашим приложением, MS предлагает упаковку файла msi MSXML6. MSXML6-это обновление от MSXML3 / 4, но не заменяет их, поскольку оно прерывает некоторые функции. Вы можете получить MSI здесь. - MSXML3
Второй выбор. Наиболее широко развернутая версия. Первоначально поставляется в марте 2000 года. Активно поддерживается, никаких новых функций. В настоящее время поддерживается, если вы находитесь на SP5 (появились в 2005 году) или позже. SP7 — текущий (с 2005 года). - MSXML5
был выпущен только в составе MS-Office. В настоящее время поддерживается Microsoft, но только как часть Office, а не для создания приложений. Не создавайте приложения, зависящие от MSXML5: Verboten. - MSXML4
первоначально отправлено? В настоящее время в»maintenance mode». Microsoft призывает людей перейти с MSXML4 на MSXML6. В настоящее время поддерживается, если вы находитесь на MSXML4SP2 или более поздней версии, которая поставляется в 2003 году. скачать MSXML4SP2 здесь. может быть redisributed.
Бесплатный парсинг сайтов за 5 минут | allrival.com — сервис мониторинга цен конкурентов
автор: Community
5 ответов
Если вам нужно поддерживать версии ОС Windows до Win2k, используйте MSXML3. В противном случае используйте MSXML6.
MSXML4 находится в режиме обслуживания.
MSXML5 никогда не поддерживался для использования вне MS-Office.
посмотреть:
- список версий Microsoft XML Parser (MSXML)
- использование правильной версии MSXML в Internet Explorer
автор: Shog9
мне пришлось принять такое же решение в моей работе пару лет назад.
на государства-узел MSDN эта версия 6 является оптимальной для использования, однако они не предоставляют модули слияния в SDK, и вам не разрешено распространять его в своем приложении, как вы могли бы с версией 4. Версия 4 была заменена версией 6, а версия 5 была специально для MS Office. Версия 3 остается целевой версией на старых машинах.
то, что я закончил, было принимая изящный подход к деградации и пытаясь использовать 6 сначала, не удалось эту версию 4, а затем не использовать версию 3 (код C++):
inline bool CXMLDocument::CreateXMLDOMFactory(void) < wxMutexLocker lock(sm_mXMLDOMFactory); if(!sm_pXMLDOMFactory) < ::CoGetClassObject(CLSID_DOMDocument60, CLSCTX_ALL, 0, IID_IClassFactory, reinterpret_cast( if(!sm_pXMLDOMFactory) < ::CoGetClassObject(CLSID_DOMDocument40, CLSCTX_ALL, 0, IID_IClassFactory, reinterpret_cast( if(!sm_pXMLDOMFactory) ::CoGetClassObject(CLSID_DOMDocument30, CLSCTX_ALL, 0, IID_IClassFactory, reinterpret_cast( > > return sm_pXMLDOMFactory != 0; >
мы заметили измеримые улучшения производительности после перехода на версию 6 из версии 4, хотя вы должны явно установить NewParser свойство документа, чтобы получить это преимущество, например:
Понятие SRAM, DRAM, ROM, PROM, EPROM, EEPROM, …
pDocument->setProperty(_bstr_t(L»NewParser»), VARIANT_TRUE);
там были также несколько обручи, чтобы прыгать через При загрузке документов из-за соображений безопасности, удаленное DTDs и так далее. Опять же, это было сделано через свойства документа, поэтому стоит посмотреть ProhibitDTD , UseInlineSchema , AllowXsltScript и ServerHTTPRequest свойства в MSDN, чтобы увидеть, применяются ли они к вашему использованию.
Источник: askdev.ru
Какую версию MSXML мне следует использовать?
Похоже, это будет частый вопрос, хотя я не смог найти его на SO.
Какую версию MSXML мне следует использовать в своих приложениях и, что более важно, как мне решить?
Есть MSXML3, 4, 5 и 6.
Недавно я разместил код в call-wcf-service-by-vbscript, который использовал MSXML. v4. AnthonyWJones написал, что я должен использовать не 4, а 3 или 6, но, вероятно, 3. Конечно, не v5!
Почему? Я хотел бы узнать больше о критериях выбора версии MSXML для использования в моих приложениях.
Дополнительный вопрос : есть ли у кого-нибудь сводка различий между различными версиями MSXML с течением времени?
Резюме на данный момент:
- MSXML6
Должен быть первым выбором. был выпущен в 2006 году и включает исправления производительности и соответствия. Используйте это, если можете. Это хорошо. Модулей слияния нет; чтобы связать среду выполнения MSXML6 с вашим приложением, MS предлагает упаковать MSXML6 msi-файл. MSXML6 является обновлением MSXML3 / 4, но не заменяет их, поскольку прекращает поддержку некоторых функций. Вы можете получить MSI здесь . - MSXML3
Вторая возможность. Наиболее распространенная версия. Первоначально поставлен в марте 2000 г. Активно поддерживается, без новых функций. В настоящее время поддерживается, если вы используете SP5 (поставлено в 2005 г.) или более поздней версии. SP7 является текущим (также с 2005 г.). - MSXML5
был выпущен только как часть MS-Office. В настоящее время поддерживается Microsoft, но только как часть Office, а не для создания приложений. Не создавайте приложения, зависящие от MSXML5: Verboten. - MSXML4
изначально отправлено? В настоящее время в «режиме обслуживания». Microsoft поощряет людей переходить с MSXML4 на MSXML6. В настоящее время поддерживается, если вы используете MSXML4SP2 или более позднюю версию, выпущенную в 2003 году. Загрузите MSXML4SP2 здесь. Можно распространять.
Cheeso 4 Июн 2009 в 20:56
5 ответов
Лучший ответ
Если вам необходимо поддерживать версии ОС Windows до Win2k, используйте MSXML3. В противном случае используйте MSXML6.
MSXML4 находится в режиме обслуживания.
MSXML5 никогда не поддерживался для использования вне MS-Office.
Видеть:
- Список версий Microsoft XML Parser (MSXML)
- Использование правильной версии MSXML в Internet Explorer
Community 20 Июн 2020 в 12:12
Мне пришлось принять такое же решение в своей работе пару лет назад.
MSDN заявляет, что версия 6 является оптимальной для использования, однако они не предоставляйте модули слияния в SDK, и вам не разрешается распространять их в своем приложении, как в версии 4. Версия 4 была заменена версией 6, а версия 5 была специально для MS Office. Версия 3 остается целевой версией на старых машинах.
В итоге я применил подход постепенной деградации и попытался сначала использовать 6, потерпел неудачу в этой версии 4, а затем отказал в использовании версии 3 (код — C ++):
inline bool CXMLDocument::CreateXMLDOMFactory(void) < wxMutexLocker lock(sm_mXMLDOMFactory); if(!sm_pXMLDOMFactory) < ::CoGetClassObject(CLSID_DOMDocument60, CLSCTX_ALL, 0, IID_IClassFactory, reinterpret_cast( if(!sm_pXMLDOMFactory) < ::CoGetClassObject(CLSID_DOMDocument40, CLSCTX_ALL, 0, IID_IClassFactory, reinterpret_cast( if(!sm_pXMLDOMFactory) ::CoGetClassObject(CLSID_DOMDocument30, CLSCTX_ALL, 0, IID_IClassFactory, reinterpret_cast( > > return sm_pXMLDOMFactory != 0; >
Мы заметили заметные улучшения производительности после перехода на версию 6 с версии 4, хотя вам нужно явно установить свойство NewParser в документе, чтобы получить это преимущество, например:
pDocument->setProperty(_bstr_t(L»NewParser»), VARIANT_TRUE);
Также было еще несколько проблем, которые нужно было преодолеть при загрузке документов из соображений безопасности, удаленных DTD и так далее. Опять же, это было сделано с помощью свойств в документе, поэтому стоит поискать свойства ProhibitDTD , UseInlineSchema , AllowXsltScript и ServerHTTPRequest в MSDN, чтобы узнать, применимы ли они к вашему использованию.
Источник: question-it.com
diman_novik_ru
Притащила одна бухгалтерша ноутбук с установленной на нём программой 1С версии 7.7. В этой старой 1С-ке не формировались бухгалтерские отчёты, при этом 1С-ка выдавала следующее сообщение об ошибке: «Компонента V7Plus : Ошибка инициализации XML Parser».
Перед этим она мне звонила, спрашивала, не знаю ли я как решить эту проблему, и я не знал, но был готов попробовать. Однако её шеф решил позвать 1С-ников. По словам бухгалтерши к ней поочереди приходили трое специалистов по 1С, но с мёртвой точки дело не сдвинулось. Пришла моя очередь :).
Я с такой проблемой никогда не сталкивался, и начал с найденных в интернете рекомендаций переустановить msxml-парсеры. Не знаю, почему, но везде, где рассматривалась эта проблема (из тех мест, что я нашёл), «знающие» люди говорили, что седьмая 1С-ка работает только с третьей версией xml-парсера, поэтому они рекомендовали удалить четвёртый и более новые, а третий переустановить. Кое где предлагали переустановить и третий и четвёртый парсер. Я это, конечно, всё попробовал, но это не помогло. По следам в системе я обнаружил, что это всё перепробовал не только я.
После этого я попробовал зарегистрировать в системе dll-ку V7Plus.dll, которая идёт с 1С-кой (на одном из форумов какой-то товарищ предлагал это сделать, сказав, что «иногда регистрация соскакивает»). «Ну давай, попробуем», — подумал я, и набрал команду «regsvr32 v7plus.dll». «Хрен тебе» — сказал мне 64-ёх битный Windows-7. Точнее, конечно, Windows сказал, что он просто не видит такую dll-ку, но я сразу перевёл на человеческий. Ладно. Попробовал засунуть эту dll-ку в папку system32. «Теперь видишь?» — спросил я Винду той же командой. «Вижу» — ответила Винда, — «но всё равно, эта dll-ка мне не нравится». Точнее, она выдала ошибку, что на этой версии Винды такая dll-ка работать не будет.
Стал искать, как решить эту проблему. Оказалось, что в 64-ёх битной Винде есть не один, а два файла «RegSvr32.exe», один в папке «%systemroot%System32», это 64-ёх битная версия, и ещё один — в папке «%systemroot%SysWoW64» — эта 32-ух битная версия. Попробовал скопировать файл «V7Plus.dll» в папку «%systemroot%SysWoW64» и дать винде команду «%systemroot%SysWoW64regsvr32.exe v7plus.dll».
Съела. «Опаньки!» — подумал я, и начал выяснять, что у нас с xml-парсером в 32-ух-битной части Винды. Дал ей команду «%systemroot%SysWoW64regsvr32.exe /u msxml3.dll» — нормально. Винда сообщила, что операция прошла успешно. Вернул регистрацию командой «%systemroot%SysWoW64regsvr32.exe msxml3.dll». Успешно. Следующая команда «%systemroot%SysWoW64regsvr32.exe /u msxml4.dll» выявила проблему.
Винда сказала, что в упор не видит dll-ку, которая конечно же лежала в папке «%systemroot%SysWoW64». Попробовал регистрацию этой dll-ки командой «%systemroot%SysWoW64regsvr32.exe msxml4.dll» — Винда сказала, что при регистрации dll-ки произошла ошибка.
Стало понятно, что проблема в этой «%systemroot%SysWoW64msxml4.dll». Благо у меня под рукой оказалась седьмая винда, только 32-ух-битная. Залез в неё, чтобы скопировать оттуда правильную dll-ку.
Msxml-парсера четвёртой версии там не оказалось, пришлось его туда установить (отсюда), после чего правильные файлы («msxml4.dll» и «msxml4r.dll») были скопированы в папку «%systemroot%SysWoW64» 64-ёх-битной Винды вместо неправильных. Неправильных файлов, к слову сказать, оказалось больше — «msxml4.dll», «msxml4a.dll», «msxml4r.dll» и «msxml4.inf», при этом «msxml4r.dll» и «msxml4.dll» отличались по датам создания от неправильных. После помещения правильных файлов в нужную папку команда «%systemroot%SysWoW64regsvr32.exe msxml4.dll» прошла на ура, после чего 1С-ка заработала как миленькая. К слову сказать, регистрировать dll-ку «V7Plus.dll» скорее всего не надо. Убеждаться в этом мне было лень.
После обновления винды отличным от правильного оказался только один файл — «msxml4r.dll». 1С-ка работает и после обновления. Фуф. Какая из программ испортила «XML Parser» выяснить не удалось.
Источник: diman-novik-ru.livejournal.com
Рушим стереотипы о HTTP и XML. (XMLHTTP и MSXML2) На примере API «Новая Почта»
За последние 2 года встречалось много конфигураций, с морально-устаревшими механизмами, написанные гуру старой закалки. В свое время подобные методы были шагом вперед, за что и «респект» их творцам, но время не стоит на месте. Более всего меня угнетает «копи-паст» кода. У большинства 1с-ников со стажем есть целые библиотеки нужных вещиц.
Но за 2-3 года все устаревает, а вот библиотечки то остаются без прогресса. Но это еще пол беды. Самое неприятное — это когда «молодые творцы», тем же «копи-пастом», строят целые схемы обменов, наращивая код до полной не читабельности. Решил поделится одним из подобных «атавизмов». В данной статье подробно опишу схему работы с API посредством XMLHTTP и MSXML2, самым оптимальным (из моего опыта) способом.
Статье больше 2-х лет. Лично я сейчас практически для всего уже использую ElisyNetBridge, гружу ассамблею и ни в чем себе не отказываю. Да и встроенные механизмы 8.3 внушают доверие, касательно кроссплатформенности. Статья на момент написания уже немного уступала прогрессу, а сейчас и подавно.
Но кто использует старые платформы с той или иной причины — будет все равно полезно, поэтому публикацию не скрываю. Стандартными механизмами пост запросы иногда без бубна не взлетают, с телом запроса постоянно нужно тыкаться, даже в 838, таки юзал хмлхттп недавно. А в целом — статья морально устаревшая. Да и АПИ Новой Почты уже перешагнуло отметку беты и увидела мир вторая версия.
С чего бы начать. Наверное с самой сути общения 1с и АПИ.
Википедия говорит, что АПИ это «набор готовых классов , процедур , функций , структур и констант , предоставляемых приложением (библиотекой, сервисом) для использования во внешних программных продуктах. Используется программистами для написания всевозможных приложений.»
Физически это дело можно сравнить с сервисом, слушающий POST запросы и отвечает источнику в соответствии с определенными сервером правилами. (не буду углублятся)
Значит суть весьма проста: По HTTP-протоколу отправить POST-запрос и дождатся ответа.
Теперь время немного углубиться.
Зачастую я встречал такой принцип в большинстве конфигураций: 1. Генерим XML с помощью Новый Запись XML, сохраняем во временную папку.
2. Открываем Новый HTTPСоединение() и «пихаем» в него нашу XML.
ОтправитьДляОбработки(ФайлXML, РесурсНаСервере, ФайлРезультата)
3. Получаем XML ответ.
4. В рекурсии обходим сие багатство с помощью Новый Чтение XML() и складываем все в дерево значений.
5. Опять в рекурсии обходим дерево для получения определенных данных. Ну просто мраки. По 100500 раз дергать файловую систему, сорить в кэше и забивать оперу временной всячиной во время обхода потенциально не нужных вещей.
Теперь в кратце, что мы будем оптимизировать на примере апи новой почты :
1. Общение с сервисом переводим на более стабильные xmlhttp
2. Для быстрого получения списка отделений — уходим от универсальности и «рекурсии на все случаи жизни», используем свой парсер msxml2 .
4. Так же уйдем от сохранения временных файлов. будем использовать тип «строка» для чтения и передачи XML.
5. Научимся использовать синхронные запросы xmlhttp. 1. Функция отправки запроса. Весьма легкая на подъем на WIN-осях (Совсем забыл уточнить, о никсах сегодня речь идти не будет)
Функция ОтправитьЗапрос(ТекстXML) Адрес = «http://orders.novaposhta.ua/xml.php»; Попытка XMLHTTP = GetCOMObject(«», «Microsoft.XMLHTTP»); XMLHTTP.Open(«POST», Адрес, Ложь); XMLHTTP.SetRequestHeader(«Content-Type», «text/xml»); XMLHTTP.Send(ТекстXML); Возврат XMLHTTP.ResponseText; Исключение Возврат Неопределено КонецПопытки; КонецФункции
Функция вернет ResponseText, в нашем случае, это такой же текст XML, как мы отправляли, который нам необходимо прочитать и обработать. И тут начинается настоящая магия =) Что бы не отвалиться на пустом ответе — проверим код ответа.
Функция ПрочитатьResponseTextXML(ResponseText) xmlParser= новый COMОбъект(«msxml2.domdocument.6.0»); //Подняли ком xmlParser.loadXML(ResponseText); // Сказали прочитать текст XML responseCode = xmlParser.selectSingleNode(«//response/responseCode»).text;//Нашли представление узла по абсолютному пути Возврат responseCode; // Вернули полученное значение КонецФункции
xmlParser ведет себя весьма дружелюбно при чтении пустой строки или некорректного ответа. И на инглише отвечает нам исключением, если что. Но подстраховатся не помешает, темболее это лишит нас лишних дальнейших»телодвижений» Следующая функция отправляет запрос на получения подразделений и парсит уже с отбором по городам. (иногда хранить всю иерархию подразделений и городов не охота + синхронизировать постоянно, а ждать загрузки всего этого добра еще менее охотней), по этому самое оптимальное решение — получать только то, что нужно и не более. Об этом немного ниже.
Функция ПолучитьТаблицуОтделений(АПИКлюч,Город) Экспорт
ОтветXMLHTTP = ОтправитьЗапрос(ТекстXML); Если ОтветXMLHTTP = Неопределено Тогда Возврат Неопределено; КонецЕсли; ТаблицаРезультат = ПрочитатьXMLПодразделений(ОтветXMLHTTP, Город); Возврат ТаблицаРезультат; КонецФункции
ОтветXMLHTTP, при успешном соединении, содержит в себе текст XML, над которым будем танцевать с бубном, что бы пропарсить как можно быстрее.
Функция ПрочитатьXMLПодразделений(XMLString, Город) ТаблицаРезультат = Новый ТаблицаЗначений; // Инициализируем ТЗ ТаблицаРезультат.Колонки.Добавить(«Город»); ТаблицаРезультат.Колонки.Добавить(«Адрес»); ТаблицаРезультат.Колонки.Добавить(«НомерОтделения»); xmlParser= новый COMОбъект(«msxml2.domdocument.6.0»); // Поднимем КОМ xmlParser.loadXML(XMLString); responseCode = xmlParser.selectSingleNode(«//response/responseCode»).text; // Получим значение узла responseCode Если responseCode = «200» Тогда colNodes = xmlParser.selectNodes(«//response/result/whs/warenhouse[cityRu='»+Город+»‘]»); // конструкция [cityRu='»+Город+»‘] вернет мне массив узлов уровня warenhouse, где cityRu равен Город Если colNodes.length = 0 Тогда // если совпадений на ру — нет, то ищем названия на укр. colNodes = xmlParser.selectNodes(«//response/result/whs/warenhouse[city='»+Город+»‘]»); КонецЕсли; Для Каждого ElementNodes из colNodes Цикл НоваяСтрока = ТаблицаРезультат.Добавить(); НоваяСтрока.Город = ElementNodes.childNodes.item(3).text; НоваяСтрока.Адрес = ElementNodes.childNodes.item(6).text; НоваяСтрока.НомерОтделения = ElementNodes.childNodes.item(7).text; КонецЦикла; КонецЕсли; Возврат ТаблицаРезультат; КонецФункции
И напоследок призент =) Состояние заказа. Видел я как-то 3-х этажную функцию по получению статуса. Вот думаю, поделюсь более свежей.
Функция ПолучитьСостояниеЗаказа(НомерЗаказа, АПИКлюч) Экспорт
ОтветXMLHTTP = ОтправитьЗапрос(ТекстXML); Если ОтветXMLHTTP = Неопределено Тогда Возврат «»; КонецЕсли; xmlParser= новый COMОбъект(«msxml2.domdocument.6.0»); xmlParser.loadXML(ОтветXMLHTTP); responseCode = xmlParser.selectSingleNode(«//file/document»); Если responseCode <> Неопределено Тогда Статус = responseCode.getAttribute(«status»); Если Статус <> Неопределено Тогда Возврат Статус; КонецЕсли; КонецЕсли; Возврат «»; КонецФункции
Надеюсь потратил не зря время на написание сего труда и пару советов все же почерпнуть можно =)))
Лично в моем случае прирост быстродействия, в последней измененной конфигурации, в среднем составил 400-500 %
З.Ы. Прошу прощение за скрины с xml, при сохранении все тэги удалялись. Не знаю с чем связано.
Источник: infostart.ru