php生成xml和數組互轉,可帶屬性、帶cdata

    因爲某個需求需要生成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);
            }
        }

    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章