php DOMDocument来自blob字段(text)的createTextNode不显示数据

时间:2016-09-09 21:05:17

标签: php xml blob

我正在尝试使用数据库表中的DOMDocument创建XML。除BLOB类型外,所有字段类型都显示在XML节点中。 在我做的下面:

$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字段设置为

BLOB SUB_TYPE 1 SEGMENT SIZE 16384

1 个答案:

答案 0 :(得分:0)

PHPs DOMDocument需要UTF-8字符串。 blob可能包含控制字符/无效的unicode序列。尝试将打破XML的数据放入变量中,并将问题减少到绝对最小值。

$blobData = $record['blobField'];

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

echo $document->saveXml();

通过这种方式,您可以查看blob数据是否真的是问题或仅仅是症状。

如果BLOB包含二进制数据,则需要将其转换为TEXT格式。 Atom提供了他们想要嵌入的urlencode二进制数据。在此,您需要解码读取程序中的值。