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

    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值