| <?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; |
| } |
| } |
|
|