Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Запись результата работа XML-парсера в MySQL

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

sardvd

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Опять у меня проблемы.
 
Суть: есть ASP-страница. Она через Msxml2.ServerXMLHTTP.3.0 отправляет некие данные стороннему серверу, получает ответ в XML-формате. Дальше этот ответ распарсивается и получается переменная:

Код:
Set objXMLReceive = Server.CreateObject("Msxml2.DOMDocument.3.0")
Set XMLBody = Server.CreateObject("Microsoft.XMLDOM")
XMLBody.Async = False
XMLBody.LoadXML objSrvHTTP.ResponseXML.XML
strReturn = XMLBody.getElementsByTagName("ProcessTextResponse").Item(0).Text

 
Эта переменная без проблемы выводится на странице через Response.Write strResponse.
 
Дальше ее нужно записать в базу:

Код:
Set adoCon = Server.CreateObject("ADODB.Connection")
strCon = RecordsetString
adoCon.Open strCon
Response.Buffer = True
    Set Update = Server.CreateObject("ADODB.Recordset")
    strSQL = "SELECT * FROM Goods WHERE Id = '" & rsg("Id") & "'"
    Update.CursorType = 2
    Update.LockType = 3
    Update.Open strSQL, strCon
        Update("Title") = strReturn
    Update.Update
    Update.Close

 
И все, кабзда. Не пишет, в базе ничего не меняется.
Причем если поменять строчку записи на любую билиберду типа Update("Title") = "dxfgdfgdfgdfg" - все прекрасно записывается. То есть, косяк в этой переменной. Но на странице-то она выводится!
 
Самое интересное, что и ошибок никаких не вылетает.
 
Логично предположить, что этот strReturn полностью аналогичен тому тексту, который уже записан в базе. Но нет - я вывожу на странице текст, который в базе, и полученную переменную - они разные!
 
Ковыряю дальше. Пробую такую строчку:
Update("Title") = "dxfgdfgdfgdfg" & strReturn - должна записаться билиберда + переменная. Так вот, НИЧЕГО не пишется вообще!
Равно как и если попытаться записать просто Update("Title") = strReturn, а сам strReturn = "dxfgdfgdfgdfg" & XMLBody.getElementsByTagName("ProcessTextResponse").Item(0).Text
 
Ну и, если просто написать strReturn = "dxfgdfgdfgdfg", то он в базу пишется.
 
Напрашивается вопрос: ЧТО там такого жуткого может быть в этой отпарсенной XML-переменной, что вызывает такой вынос мозга? ) При ее выводе на страницу никаких гвоздей не наблюдается, просто обычный чистый текст.

Всего записей: 126 | Зарегистр. 16-12-2007 | Отправлено: 16:56 08-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sardvd
а с кодировкой нет проблем?  
или каких то спецсимволов в строке?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:43 09-10-2013
esche

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
ЧТО там такого жуткого может быть в этой отпарсенной XML-переменной, что вызывает такой вынос мозга? ) При ее выводе на страницу никаких гвоздей не наблюдается, просто обычный чистый текст.

а функциями типа ord() посимвольно разобрать и посмотреть не пробовали?

Всего записей: 49 | Зарегистр. 03-05-2013 | Отправлено: 00:26 10-10-2013
sardvd

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С кодировкой проблем нет. По крайней мере, на экране.
Лишних символов не замечено.
Посимвольно разобрал. Ничего лишнего.

Всего записей: 126 | Зарегистр. 16-12-2007 | Отправлено: 00:37 10-10-2013
esche

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 Response.Write strResponse.  

видимо, опечатка.
А какой тип получается у strReturn?
 
Если сохранить XML локально и в XML в title вставить dfdfdfdf на английском?
Если сохранить XML и сконвертировать его в 1251 (он ведь в UTF-8)? Или непосредственно строку (так примерно) перекодировать?

Всего записей: 49 | Зарегистр. 03-05-2013 | Отправлено: 10:12 10-10-2013
sardvd

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу прощения, что так выпал из дискуссии - обстоятельства заставили отвлечься от разработки.
 
Итак, кажется, проблема нашлась.
"Некий сторонний сервис" - это "Типограф" от Лебедева http://www.artlebedev.ru/tools/typograf/webservice/
При формировании SOAP-запроса передается такой параметр: "<entityType>3</entityType>"
Это - тип возвращаемых символов (например, если стоит 3 - то возвращается не &laquo;, а кавычки в utf - «).
Если поменять этот параметр на 1, то возвращается как раз &laquo;. И в базу все пишется.
То есть, проблемы все-таки с кодировкой. Курю дальше...
 
Добавлено:
Что интересно.
Сперва текст берется из базы, потом пишется в базу.
Когда берется, его нужно конвертировать функцией ConverttoUTF:
Код:
Function ConvertToUtf(sIn)
    Set Recode = CreateObject("ADODB.Stream")
    Recode.Open  
    Recode.CharSet = "Windows-1251"
    Recode.WriteText sIn
    Recode.Position = 0
    Recode.CharSet = "UTF-8"
    ConvertToUtf = Recode.ReadText
    Recode.Close
End Function

 
Перед записью в базу его нужно прогнать другой функцией Convert1251toUtf:Подробнее...
 
По другому даже с <entityType>1</entityType> не пишет.
 
Добавлено:
Дальнейшее курение методом тыка выяснило следующее:
 
Если стоит <entityType>1</entityType>, то все пишется.
 
Если стоит <entityType>3</entityType> и есть символы типа кавычек в utf, то не пишется.
Если стоит <entityType>3</entityType> и в строке только текст с обычными пробелами - опять пишется.
 
Вывод: проблема в кодировке спецсимволов (кавычки, тире, неразрывные пробелы и прочее).
 
Добавлено:
Продолжаем эксперименты.
Получаем результат с <entityType>1</entityType>.
Прогоняем результат через вот такую конструкцию:
 
strReturn = Replace(strReturn,"&laquo;","«")
 
Получаем фиг. Не пишется. Хотя этот символ вот прям из базы скопирован.
Причем просто из например поля формы такие символы пишутся без проблем.

Всего записей: 126 | Зарегистр. 16-12-2007 | Отправлено: 14:05 15-10-2013 | Исправлено: Cheery, 21:51 18-10-2013
sardvd

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Неужели нет никаких идей?

Всего записей: 126 | Зарегистр. 16-12-2007 | Отправлено: 14:27 18-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sardvd

Цитата:
Неужели нет никаких идей?

какая разница, что пишется в entitytype? главное, что у вас передается в запросе в базу
проблема в том, что сейчас мало кто (по крайней мере на форуме) использует ASP
вывод ошибок не пробовали делать?
http://support.sas.com/documentation/tools/oledb/app_error_objects.htm

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:56 18-10-2013
sardvd

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
какая разница, что пишется в entitytype?

Разница в том, что при entitytype=1 возвращаются и пишутся в базу htmlentities типа &laquo; - и в таком случае запись происходит.
А при entitytype=3 возвращаются и пытаются писаться в базу символы в utf типа « - и в таком случае запись не проходит.
 
Нашел косяк в том, что при отправке XML прописано "On Error Resume Next", и оно распространяется и на код записи в базу.
Так что теперь я вижу, что конкретно ему не нравится.
 
Итак:
- при попытке записать htmlentities типа &laquo; - все ок;
- при попытке записать символы в utf типа « - вываливается ошибка:

Цитата:
Incorrect string value: '\xAB\xD0\x9A\xD0\xBE\xD0...'

 
Теперь вот пытаюсь понять, что это за кодировка у строки получается... Причем на экран эта строка выводится нормально...
 
Добавлено:
Поисковики говорят, что косяк в кодировке.
Логично, блин )
Но:
- код скрипта в UTF-8
- база в utf8_general_ci
- строка соединения выглядит так: RecordsetString = "Driver={MySQL};Stmt=SET NAMES 'utf8';SERVER=localhost;DATABASE=***;UID=**;PWD=***;Extended Properties='OPTION=16387';"

Всего записей: 126 | Зарегистр. 16-12-2007 | Отправлено: 22:31 20-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sardvd

Цитата:
Incorrect string value: '\xAB\xD0\x9A\xD0\xBE\xD0...'

значит база у вас не в уникоде. проверьте.
либо для столбцов не уникод.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:41 20-10-2013
sardvd

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Воткнул дамп базы в Notepad++.
Юникод.
Куча символов типа «.
В блоке "Table structure for `goods`" написано: "ENGINE=InnoDB AUTO_INCREMENT=1038 DEFAULT CHARSET=utf8;"

Всего записей: 126 | Зарегистр. 16-12-2007 | Отправлено: 22:47 20-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sardvd
базы мало - смотрите кодировки таблиц и столбцов, там же можно все другое указать.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:51 20-10-2013 | Исправлено: Cheery, 22:52 20-10-2013
sardvd

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery, конечно и их посмотрел. Дамп только искомой таблицы - все ок. Кодировки столбцов в дампе не упоминаются, но в свойствах (пользуюсь Navicat Lite) указано:
- character set: utf8
- collation: utf8_general_ci

Всего записей: 126 | Зарегистр. 16-12-2007 | Отправлено: 22:57 20-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sardvd
дамп структуры покажите.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:59 20-10-2013
sardvd

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
http://sard.smtp.ru/goods.sql

Всего записей: 126 | Зарегистр. 16-12-2007 | Отправлено: 23:04 20-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sardvd
попробуйте указать как написано тут  
http://stackoverflow.com/q/13994706/1164491
 

Цитата:
You need to specify the character set in the connection string using the charset parameter; see the MySQL ODBC doco. e.g. add "charset=utf8;" "charset=ucs2;" to your connection string.
 
Edited: I finally got a chance to run a simple test harness on this, and it does indeed fail with charset=utf8. However, since VBScript is running internally with UCS2, I gave it a try with charset=ucs2 and it works fine. NB: page is still set to send all output as UTF-8, it's just that VBScript is pulling data from an ODBC connection using UCS2. Job is done



----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:08 20-10-2013 | Исправлено: Cheery, 23:09 20-10-2013
sardvd

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Увы...
Сделал все, как в ссылке, с ucs2, но не помогло...
 
Что непонятно: эти символы нормально пишутся, если например были отправлены из формы.
Прям набранные в коде - тоже нормально.
А полученные от XML-ответа - вышеуказанная ошибка.
 
Добавлено:
Победа.
Все-таки фигня была в кодировках.
 
Чтобы получать нормальный ответ от "типографа", нужно использовать <%@ CODEPAGE = 65001 %>.
Если использовать старенький ODBC-драйвер, который использовал я, то указание кодовой страницы приводит к выводу каракулей из базы данных. (Я кстати давно подозревал, что там что-то не то с кодировками - такое ощущение, что оно перекодируется "на лету").
Однако использовать современый коннекто типа MySQL ODBC 5.2w Driver тоже не вариант, потому что тогда из базы прилетают каракули, даже если указывать 'SET NAMES UTF8'. Поэтому я с момента перехода на MySQL использовал старый драйвер.
Ссылка на стэкоуверфло натолкнула на мысль снова попробовать драйвер 5.2w, но с "charset=ucs2;". И - о чудо! - из базы все нормально выводится, даже с указанием кодовой страницы.
Соответственно, декодер тоже заработал.

Всего записей: 126 | Зарегистр. 16-12-2007 | Отправлено: 23:43 20-10-2013
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » Запись результата работа XML-парсера в MySQL


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru