2009-07-06 5 views
1

Я пишу веб-интерфейс для MySQL, который выполняет пару запросов и возвращает некоторые XML-данные с результатами запросов. Сейчас таблица, в которой выполняется запрос, имеет три столбца LONGBLOB (для хранения данных изображения и т.п.).MySQL 5.0: вывод данных BLOB в (правильно сформированном) формате XML?

Однако, когда я пытаюсь разобрать XML, у меня возникают проблемы с определенными символами в столбцах BLOB: похоже, что MySQL просто сбрасывает прямые шестнадцатеричные данные в поток, что не принимается моим парсером.

Есть ли способ, которым MySQL может иметь хорошо сформированный XML, содержащий шестнадцатеричные данные? Я посмотрел опцию mysqldump --hex-blob, но я работаю с программой mysql, так как мне нужно запускать запросы по таблицам, а не просто получать содержимое всей таблицы. Я был бы в порядке со строковым представлением, элементом xs:hexBinary в теге <field> или что-то в этом роде.

Редактировать: Я работаю в PHP 5.2.9. Основой вопроса является предоставление своего рода Digg-подобного API с несколькими доступными для HTTP конечными точками, например. /objects, /edit и т. Д. Идея состоит в том, что несколько клиентских приложений на нескольких платформах могут использовать API в качестве общей основы для доступа к одному набору данных, не заботясь о поддержке базы данных (которая может быть изменена).

Один из типов объектов, которые я храню, представляет собой (небольшое) изображение, и я хотел бы сделать это непосредственно в базе данных с использованием типа MySQL LONGBLOB. (Я отвечаю только за то, что API работает с базой данных MySQL, поэтому ответы могут принимать тип, язык и утилиты DB как givens.) В основном я ищу, чтобы найти способ вернуть изображение назад к запрашивающему приложению в том же XML-документе, что и некоторые другие данные смешанного типа (в основном строки).

Edit: Я получаю XML из MySQL, используя комбинацию программы mysql --xml командной строки и функции PHP passthru. Это был самый простой способ сделать то, что я хотел, в то время, когда я его разрабатывал; Есть ли способ лучше? Должен ли я строить XML в PHP из полей MySQL, а не в зависимости от MySQL, чтобы сделать это для меня? И если это так, облегчит ли отправку данных изображения в XML?

+0

из вашего описания, у меня сложилось впечатление, что вы получаете XML непосредственно с MySQL, а не получать поля из XML и создание XML в PHP. Это так? Можете ли вы предоставить какой-нибудь псевдокод или что-то еще, а может быть, образец XML, который вызывает проблему? Вы считаете, что вы храните файлы на диске и сохраняете только их имена в БД, правильно? Основная идея такая же, как только вы получите данные изображения. –

ответ

3

Вы не можете поместить прямые двоичные данные в документ XML. Вы можете поместить любой символ, который действителен в вашей кодировке (возможно, UTF-8) в документе XML, если вы поместите его в раздел CDATA (и он не содержит строку «<! [CDATA [»), но raw бинарные данные будут иметь недопустимые последовательности UTF-8. Вам нужно будет преобразовать двоичные данные в какое-то текстовое представление.

Использование xs: hexBinary format (т. Е. [0-9A-F] {2}) будет генерировать 2 символа (байты) для каждого байта двоичных данных.

Использование кодировки Base64 использует 4 символа для каждых 3 байтов данных (2^8/2^6), поэтому это более эффективный формат. К сожалению, делать это из MySQL составляет messy, поэтому, вероятно, лучше извлечь данные из MySQL в двоичном формате и закодировать его в Base64 в своем веб-приложении.

Редактировать: SO, похоже, разбирает раздел CDATA. Я добавил пробелы вокруг "!" чтобы заставить его перестать разбирать его и активировать форматирование.

редактировать:

Не зная многое о том, что вы делаете, позвольте мне дать краткое изложение одного из способов сделать это:

// ... setup and exec query... 
while ($row = mysql_fetch_assoc($rs)) { 
    print('<item>'); 
    print('<date>' . $row['date'] . '</date>'); 
    // ... etc. ... 
    // more efficient to use mysql_result but this is simpler 
    $img = $row['image']; 
    print('<image>' . base64_encode($img) . '</image>'); 
    // CDATA is *probably* not needed 
    print('<image><![CDATA[' . base64_encode($img) . ']]></image>'); 
    // or, if you decide you want hex format anyway... 
    print('<image>' . unpack('H*', $img) . '</image>'); 
} 

Это должно производить строго правильный XML. Подумайте об этом, теперь шестнадцатеричные данные должны быть в XML. Какой парсер вы используете?

+0

Спасибо за информацию! Я обновил вопрос, чтобы предоставить дополнительную информацию об окружающей среде и предполагаемом использовании (PHP). – Tim

+0

@Codebender: попробуйте использовать обратные ссылки вокруг встроенного кода: например, '' Stobor

+0

Использование в основном iPhone XML синтаксический анализатор. – Tim

0

XML не поддерживает хранение двоичных данных непосредственно использовать Base64 кодирование

+0

Можете ли вы рассказать об этом несколько? Как я могу заставить mysql выводить «кодировку base64» в XML? Было бы даже оценено даже ссылку на документ. – Tim

0

Это, вероятно, сделать UTF8-кодирование изображения легче, и это было бы также сделать ваш сайт более отзывчивым, если вы сделали запрос MySQL и встроенный XML-файл в PHP ... Вилка & Exec дорогие операции ....

вы могли бы просто использовать simpleXml и сделать что-то вроде: (? через хранимые проки)

$myxml->addChild('imageBlob', base64_encode($mysql_row['imageBlob']));