2

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

ただし、XML を解析しようとすると、BLOB 列の特定の文字で問題が発生します。MySQL が単純な 16 進データをストリームにダンプしているように見えますが、これはパーサーによって受け入れられません。

16 進データを含む整形式の XML を MySQL に出力させる方法はありますか? mysqldump --hex-blobオプションを見ましたがmysql、テーブル全体の内容を取得するだけでなく、テーブルに対してクエリを実行する必要があるため、プログラムを使用しています。文字列表現、タグxs:hexBinary内の要素、または同様のもので問題ありません。<field>

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

私が格納しているオブジェクト タイプの 1 つは (小さい) 画像であり、MySQL LONGBLOB タイプを使用してデータベースに直接格納したいと考えています。(私は、MySQL バックエンド データベースで API を機能させることのみを担当しているため、DB の種類、言語、およびユーティリティを与えられたものとして回答することができます。) 基本的に私が探しているのは、画像を返す方法を見つけることです他の混合型データ (ほとんどの場合文字列) と同じ XML ドキュメント内の要求側アプリケーションに。

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

4

3 に答える 3

3

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

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

Base64 エンコーディングを使用すると、データの 3 バイトごとに 4 文字 (2^8/2^6) が使用されるため、より効率的な形式になります。残念ながら、MySQL からこれを行うのは面倒なので、MySQL からバイナリ形式でデータを抽出し、Web アプリで Base64 にエンコードする方がよいでしょう。

編集: SO は CDATA セクションを解析するようです。「!」の前後にスペースを追加しました。それを解析して書式設定を無効にするのをやめさせます。

編集:

何をしているのかよくわからないので、これを行う 1 つの方法の概要を説明しましょう。

// ... 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 が生成されます。考えてみれば、今持っている 16 進データは XML で問題ないはずです。どのパーサーを使用していますか?

于 2009-07-13T17:49:55.420 に答える
0

XML はバイナリ データの直接保存をサポートしていません。Base64 エンコーディングを使用してください。

于 2009-07-12T00:17:09.417 に答える
0

これにより、画像の UTF8 エンコードが容易になり、また、mysql クエリを実行して xml を php で構築した場合、サイトの応答性が向上します... fork と exec は高価な操作です....

simpleXmlを使用して、次のようなことを行うことができます。

$myxml->addChild('imageBlob', base64_encode($mysql_row['imageBlob']));
于 2009-07-16T05:46:19.387 に答える