|
|
<?php |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace think\response; |
|
|
|
|
|
use think\Collection; |
|
|
use think\Model; |
|
|
use think\Response; |
|
|
|
|
|
class Xml extends Response |
|
|
{ |
|
|
|
|
|
protected $options = [ |
|
|
|
|
|
'root_node' => 'think', |
|
|
|
|
|
'root_attr' => '', |
|
|
|
|
|
'item_node' => 'item', |
|
|
|
|
|
'item_key' => 'id', |
|
|
|
|
|
'encoding' => 'utf-8', |
|
|
]; |
|
|
|
|
|
protected $contentType = 'text/xml'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected function output($data) |
|
|
{ |
|
|
|
|
|
return $this->xmlEncode($data, $this->options['root_node'], $this->options['item_node'], $this->options['root_attr'], $this->options['item_key'], $this->options['encoding']); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected function xmlEncode($data, $root, $item, $attr, $id, $encoding) |
|
|
{ |
|
|
if (is_array($attr)) { |
|
|
$array = []; |
|
|
foreach ($attr as $key => $value) { |
|
|
$array[] = "{$key}=\"{$value}\""; |
|
|
} |
|
|
$attr = implode(' ', $array); |
|
|
} |
|
|
$attr = trim($attr); |
|
|
$attr = empty($attr) ? '' : " {$attr}"; |
|
|
$xml = "<?xml version=\"1.0\" encoding=\"{$encoding}\"?>"; |
|
|
$xml .= "<{$root}{$attr}>"; |
|
|
$xml .= $this->dataToXml($data, $item, $id); |
|
|
$xml .= "</{$root}>"; |
|
|
return $xml; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected function dataToXml($data, $item, $id) |
|
|
{ |
|
|
$xml = $attr = ''; |
|
|
|
|
|
if ($data instanceof Collection || $data instanceof Model) { |
|
|
$data = $data->toArray(); |
|
|
} |
|
|
|
|
|
foreach ($data as $key => $val) { |
|
|
if (is_numeric($key)) { |
|
|
$id && $attr = " {$id}=\"{$key}\""; |
|
|
$key = $item; |
|
|
} |
|
|
$xml .= "<{$key}{$attr}>"; |
|
|
$xml .= (is_array($val) || is_object($val)) ? $this->dataToXml($val, $item, $id) : $val; |
|
|
$xml .= "</{$key}>"; |
|
|
} |
|
|
return $xml; |
|
|
} |
|
|
} |
|
|
|