服务器测评网
我们一直在努力
广告
广告
广告
广告
广告
广告
广告
广告
广告
广告
广告
广告
广告
广告

php实现xml和array互转 xml可带属性

好主机测评广告位招租-600元/3月

本文介绍了一个名为classXmlTransformTools的类,用于实现XML与数组之间的高效转换,支持根节点定制、CData处理及版本设置。核心方法包括xmlToArray解析XML字符串为数组,arrayToXml则将数组转化为XML字符串。

class XmlTransformTools
{
    private static $init;
    private static $domObject;
    private $xmlContent = '';
    private $arrayList = [];
    public static $rootName = 'DOCUMENT';  //根节点的名称
    public $cdata = false;      //cdata的开关
    public static $xmlVersion = '1.0';  //设置版本
    public static $xmlEncode = 'utf-8'; //设置字符类型

    private function __construct()
    {
    }

    public static function init($rootName='')
    {
        if (empty(self::$init)) {
            self::$init = new self();
        }
        self::$rootName=empty($rootName)?'DOCUMENT':$rootName;

        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(self::$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);
            }
        }

    }

}

调用:
xml转换成数组:

//xml转数组:REQUEST_COMMON_FPKJ是根节点
  $array=XmlTransformTools::init('REQUEST_COMMON_FPKJ')->xmlToArray($xml);
//数组专xml:REQUEST_COMMON_FPKJ是根节点
 $xml2=XmlTransformTools::init('REQUEST_COMMON_FPKJ')->arrayToXml($array);

 

heiseo免实名域名
赞(0) 打赏
未经允许不得转载:好主机测评网 » php实现xml和array互转 xml可带属性
好主机测评广告位招租-600元/3月
好主机测评广告位招租-600元/3月

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫