*/ class Xml { /** * @param $data * @param string $root * @param string $attr * @param bool $forceCdata * @param string $encoding * @return mixed */ public static function encode($data, $root = 'xml', $attr = '', $forceCdata = false, $encoding = 'utf-8') { if (is_array($attr)) { $_attr = []; foreach ($attr as $key => $value) { $_attr[] = "{$key}=\"{$value}\""; } $attr = implode(' ', $_attr); } $attr = trim($attr); $attr = empty($attr) ? '' : " {$attr}"; $xml = "" . PHP_EOL; $xml .= "<{$root}{$attr}>" . PHP_EOL; $xml .= self::dataToXml($data, '', $forceCdata); $xml .= ""; return $xml; } /** * 数据XML编码 * * @param mixed $data 数据 * @param bool $forceCdata * @param string $parentkey * @return string */ protected static function dataToXml($data, $parentkey = '', $forceCdata = false) { $xml = ''; foreach ($data as $key => $val) { if (is_numeric($key)) { $key = $parentkey; } elseif (substr($key, 0, 10) == '__string__') { $xml .= $val; continue; } $key = $key ? $key : 'xmldata'; $xml .= "<{$key}>"; if (is_array($val) || is_object($val)) { $len = strlen("<{$key}>"); $con = self::dataToXml($val, $key, $forceCdata); if (strpos($con, "<{$key}>") === 0) { $con = substr(trim($con), $len, -($len + 1)); } $xml .= $con; } elseif ($forceCdata || strlen($val) > 150 || preg_match('{[<>&\'|"]+}', $val)) { $xml .= ''; } else { $xml .= $val; } $xml .= "" . PHP_EOL; } return $xml; } public static function decode($con) { if (!$con) { return []; } if ($con{0} == '<') { $con = simplexml_load_string($con, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS); } else { $con = simplexml_load_file($con, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS); } return Json::decode(Json::encode($con), true); } }