2016-09-09 9 views
2

データベーステーブルからDOMDocumentを使用してXMLを作成しようとしています。 BLOBタイプ以外のすべてのフィールドタイプがXMLノードに表示されています。私がやったことを以下に :php DOMDocument blobフィールド(テキスト)のデータを表示しないcreateTextNode

$rs = ibase_query("SELECT * FROM mytable"); 
$coln = ibase_num_fields($rs); 
$fieldnames = array(); 
for ($i = 0; $i < $coln; $i++) { 
    $col_info = ibase_field_info($rs, $i); 
    $fieldnames[] = array('name' => $col_info['name'], 'type' => $col_info['type']); 
} 

$doc = new DOMDocument('1.0'); 
$sth = ibase_query($dbh, $stmt); 
$doc->formatOutput = true; 
$root = $doc->createElement('FA_ARTIKEL'); 
$root = $doc->appendChild($root); 
while ($row = ibase_fetch_object($sth, IBASE_TEXT)) { 
    $title = $doc->createElement('RECORD'); 
    $title = $root->appendChild($title); 

    $text = $doc->createTextNode(''); 
    $text = $title->appendChild($text); 
    foreach ($fieldnames as $value) { 
     switch ($value['type']) { 
      case 'VARCHAR': 
       $rtitle = $doc->createElement($value['name']); 
       $rtitle = $title->appendChild($rtitle); 

       $rtext = $doc->createTextNode($row->$value['name']); 
       $rtext = $rtitle->appendChild($rtext); 
       break; 

      case 'BLOB': 
       $rbtitle = $doc->createElement($value['name']); 
       $rbtitle = $title->appendChild($rbtitle); 

       $rbtext = $doc->createTextNode($row->$value['name']); 
       $rbtext = $rbtitle->appendChild($rbtext); 
       break; 

      default: 
       if ($row->$value['name']) { 
        $rtitle = $doc->createElement($value['name']); 
        $rtitle = $title->appendChild($rtitle); 

        $rtext = $doc->createTextNode($row->$value['name']); 
        $rtext = $rtitle->appendChild($rtext); 
       } else { 
        $rtitle = $doc->createElement($value['name']); 
        $rtitle = $title->appendChild($rtitle); 

        $rtext = $doc->createTextNode('0'); 
        $rtext = $rtitle->appendChild($rtext); 
       } 
       break; 
     } 
    } 
} 

Header('Content-type: text/xml'); 
echo $doc->saveXML() . "\n"; 
ibase_free_result($sth); 
ibase_close($dbh); 

は、私はまたのSimpleXMLElementをしようとしたが、それも失敗しました。私は何が欠けているのですか? 私のデータベースはFirebirdのです

BLOB SUB_TYPE 1 SEGMENT SIZE 16384 

答えて

0

PHPSのDOMDocumentは、UTF-8文字列を期待して、私は、BLOBフィールドを設定します。ブロブに制御文字/無効なユニコードシーケンスが含まれている可能性があります。 XMLを破るデータを変数に入れて、問題を最小限に抑えてください。

$blobData = $record['blobField']; 

$document = new DOMDocument(); 
$document 
    ->appendChild($document->createElement('foo')) 
    ->appendChild($document->createTextNode($blobData)); 

echo $document->saveXml(); 

このようにして、BLOBデータが本当に問題であるか単なる症状であるかを確認できます。

BLOBにバイナリデータが含まれている場合は、そのデータをTEXT形式に変換する必要があります。 Atomは、埋め込みたいバイナリデータのurlencodeを提供します。ここでは、読書プログラムの値をデコードする必要があります。

関連する問題