因为某个需求需要生成xml文件,找了许多例子没有发现自己想要的,后面整理写出了这个,记录下来。
xml转换成数组:
XmlTransformTools::init()->xmlToArray($txt);
数组转换成xml:
XmlTransformTools::init()->arrayToXml($array);
class XmlTransformTools
{
private static $init;
private static $domObject;
private $xmlContent = '';
private $arrayList = [];
public $rootName = 'DOCUMENT'; //根节点的名称
public $cdata = false; //cdata的开关
public static $xmlVersion = '1.0'; //设置版本
public static $xmlEncode = 'utf-8'; //设置字符类型
private function __construct()
{
}
public static function init()
{
if (empty(self::$init)) {
self::$init = new self();
}
return self::$init;
}
public static function domObject()
{
if (empty(self::$domObject)) {
self::$domObject = new \DomDocument(self::$xmlVersion, self::$xmlEncode);
}
return self::$domObject;
}
private function XmlToObject()
{
return $this->arrayList = simplexml_load_string($this->xmlContent, 'SimpleXMLElement', LIBXML_NOCDATA);
}
private function XmlObjectToJsonString()
{
return $this->arrayList = json_encode($this->arrayList);
}
private function jsonToArray()
{
return $this->arrayList = json_decode($this->arrayList, true);
}
/**
* @param string $xmlString
* @return mixed 返回xml解析的数组
*/
public function xmlToArray($xmlString = '')
{
$this->xmlContent = $xmlString;
$this->XmlToObject();
$this->XmlObjectToJsonString();
return $this->jsonToArray();
}
/**
* @param array $array
* @return string 返回xml文本
*/
public function arrayToXml(array $array = [])
{
return $this->xmlCreateByArray($array);
}
private function createNode($node = '', $value = null)
{
return self::domObject()->createElement($node, $value);
}
private function createTextNode(string $text = '')
{
return self::domObject()->createTextNode($text);
}
private function createCDATA(string $CDATA = '')
{
return self::domObject()->createCDATASection($CDATA);
}
private function appendChild(DOMNode $node = null, $childNode = null)
{
return $node->appendChild($childNode);
}
private function xmlCreateByArray(array $array = [])
{
$root = self::domObject()->createElement($this->rootName);
self::domObject()->appendChild($root);
$this->callBackXmlCreate($array, $root);
$rs = self::domObject()->saveXML();
self::domObject()->removeChild($root);
return $rs;
}
/**
* 对转换设置的回调操作
* @param $array 要转换的数组
* @param null $pkTmp 上一级node节点对象
* @param string $elementName 针对同名节点设置的创建名称
*/
private function callBackXmlCreate($array, $pkTmp = null, $elementName = '')
{
$key = '';
foreach ($array as $k => $v)
{
$nodeName = is_numeric($k) ? $elementName : $k;
if (is_array($v)) {
$key = key($v);
}
if (is_numeric($key) || $nodeName === '@attributes') {
$kTmp = $pkTmp;
} else {
$kTmp = $this->createNode($nodeName);
}
if ($nodeName === '@attributes') {
foreach ($v as $kk => $vv) {
$kTmp->setAttribute($kk, $vv);
}
continue;
}
if (!is_array($v)) {
if ($this->cdata) {
$vTmp = $this->createCDATA($v);
} else {
$vTmp = $this->createTextNode($v);
}
$this->appendChild($kTmp, $vTmp);
}
if (!empty($pkTmp) && !is_numeric($key)) {
$this->appendChild($pkTmp, $kTmp);
}
if (is_array($v)) {
if (!is_numeric($k)) {
$elementName = $k;
}
$this->callBackXmlCreate($v, $kTmp, $elementName);
}
}
}
}