2009-07-06 25 views
1

私は、いくつかのクエリを実行し、いくつかのXMLデータをクエリの結果とともに返す、MySQLへのWebインターフェイスを作成しています。現在、クエリが実行されているテーブルには、3つのLONGBLOB列(画像データなどを格納するための列)があります。MySQL 5.0:(整形式の)XML形式のBLOBデータを出力しますか?

しかし、XMLを解析しようとすると、BLOB列の特定の文字に問題が発生します。MySQLはストレートヘキサデータをストリームにダンプしているようですが、これはパーサーが受け入れていません。

16進データを含むMySQL出力の​​整形式XMLを作成する方法はありますか?私はmysqldump --hex-blobオプションを見ましたが、テーブルの内容全体を取得するのではなく、テーブルに対してクエリを実行する必要があるので、mysqlプログラムで作業しています。文字列表現の場合はタグのxs:hexBinary要素、またはそれに類するものであれば問題ありません。

編集:私はPHP 5.2.9で作業しています。この問題の背景は、一種のDiggのようなAPIに複数のHTTPでアクセス可能なエンドポイントを提供することです。 /objects,/editなど。この考え方は、複数のプラットフォームにまたがる多数のクライアントアプリケーションが、同じデータセットにアクセスするための共通の基盤としてAPIを使用することができるということです(変更の対象となるデータベースを気にする必要はありません)。

私が保存しているオブジェクトの種類の1つは、(小さな)イメージです。これは、MySQL LONGBLOB型を使用してデータベースで直接行いたいものです。 (私はMySQLバックエンドデータベースでAPIを動作させる責任しか負いませんので、答えはDB型、言語、ユーティリティをgivensとして取ることができます)。基本的に私が探しているのは、他の混合型データ(主に文字列)と同じXML文書内の要求元のアプリケーションに送信します。

編集:私はmysql --xmlコマンドラインプログラムとPHP passthru機能の組み合わせを使用してMySQLのうち、XMLを取得しています。これは私がそれを開発していた時に私が望んでいたことを達成する最も簡単な方法でした。そこには良い方法がありますか? MySQLに依存するのではなく、MySQLフィールドからPHPでXMLを構築するべきですか?もしそうなら、XMLで画像データを簡単に送ることができますか?

+0

を、私はあなたがMySQLのから直接XMLを取得している印象を受けました、ではなくXMLからフィールドを取得よりも、とPHPでのXMLの構築それは事実ですか?何らかの擬似コードや何かを提供できますか、問題の原因となっているXMLのサンプルですか? *ディスクにファイルを保存し、その名前をDBに保存することを検討していますか?基本的なアイデアは同じですが、イメージデータを取得すると同じです。 –

答えて

3

をサポートしていません。 CDATAセクション内に置くと、エンコーディングに有効な文字(おそらくUTF-8)をXMLドキュメントに入れることができます(文字列 "<![CDATA ["]を含むことはありませんが、rawバイナリデータに無効なUTF-8シーケンスが含まれます。バイナリデータをある種のテキスト表現に変換する必要があります。

xs:hexBinary形式([0-9A-F] {2})を使用すると、バイナリデータの各バイトに対して2文字(バイト)が生成されます。

Base64エンコーディングを使用すると、3バイトのデータ(2^8/2^6)ごとに4文字が使用されるため、より効率的なフォーマットです。残念ながら、MySQLからこれを行うのはmessyなので、バイナリ形式でMySQLからデータを抽出し、Webアプリケーションの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になっているはずの16進データ。あなたはどのパーサーを使用していますか?

+0

情報ありがとう!私は環境と意図された使用(PHP)に関する詳細情報を提供するために質問を更新しました。 – Tim

+0

@Codebender:インラインコードのバックチックを試してみてください: '' <![CDATA [''は私のコメントが邪魔されないならば<![CDATA ['を返すべきです) – Stobor

+0

主にiPhone XMLパーサ。 – Tim

0

XMLは、XML文書にストレートバイナリデータを置くことができない使用し、直接バイナリデータを格納するBase64エンコーディング

+0

これを幾分拡張できますか?どのようにしてmysqlに "base64 encoding"をXMLで出力するのですか?どこかの医者へのリンクさえも高く評価されます。 – Tim

0

それはおそらくUTF8エンコード画像が容易になるだろう、とあなたはMySQLのクエリを行なったし、PHPでXMLを構築した場合、それはまた、あなたのサイトはより敏感になるだろう...フォーク&幹部は、高価な操作です....

あなただけsimpleXmlを使用してのような何かを行うことができます:(?保存されprocsのを経由して)あなたの説明から

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