登录站点

用户名

密码

自由联盟 - 开源项目提交群组

  • 分享

    一个简易的PHP XML 操作类SmallXmlDOM

    1vb2005xu 2011-10-24 18:39
    <?php
    class SmallXmlDOM {

        /**
         * @var DOMDocument
         */
        private $_doc;

        /**
         * @var DOMElement
         */
        private $_root;

        function __construct($rootNodeName,$charset='utf-8'){
            $this->_doc = new DOMDocument('1.0',$charset);
            $this->_root = $this->_doc->createElement($rootNodeName);
            $this->_doc->appendChild($this->_root);
        }

        function asXML(){
            return $this->_doc->saveXML();
        }

        /**
         * @return DOMElement
         */
        function getDocumentRoot(){
            return $this->_root;
        }

        private function createElement($name,$value=NULL){
            $subElement = $this->_doc->createElement($name);
            /* @var $subElement DOMElement */
            if ($value === null)
            return $subElement;

            $valueElement = $this->_doc->createCDATASection($value);
            $subElement->appendChild($valueElement);
            return $subElement;
        }

        /**
         * 创建并追加 子节点到父节点后,并返回 创建的子节点对象
         *
         * @param DOMElement $parentNode
         * @param string $nodeName
         * @param mixed $nodeValue
         *
         * @return DOMElement
         */
        function addChild(DOMElement $parentNode,$nodeName,$nodeValue=NULL){
            $subNode = $this->createElement($nodeName,$nodeValue);
            $parentNode->appendChild($subNode);
            return $subNode;
        }

        /**
         * convert xml string to php array - useful to get a serializable value
         *
         * @param string $xmlstr
         * @return array
         */
        static function xmlstr_to_array($xmlstr) {
            $doc = new DOMDocument();
            $doc->loadXML($xmlstr);
            return self::domnode_to_array($doc->documentElement);
        }
        
        /**
         * DOM节点转字符串
         *
         * @param DOMElement $node
         * @return array
         */
        static function domnode_to_array($node) {
            $output = array();
            switch ($node->nodeType) {
                case XML_CDATA_SECTION_NODE:
                case XML_TEXT_NODE:
                    $output = trim($node->textContent);
                       break;
                case XML_ELEMENT_NODE:
                    for ($i=0, $m=$node->childNodes->length; $i<$m; $i++) {
                        $child = $node->childNodes->item($i);
                        $v = self::domnode_to_array($child);
                        if(isset($child->tagName)) {
                            $t = $child->tagName;
                            if(!isset($output[$t])) {
                                $output[$t] = array();
                            }
                            $output[$t][] = empty($v) ? null : $v;
                        }
                        elseif($v) {
                            $output = (string) $v;
                        }
                    }
                    if(is_array($output)) {
                        if($node->attributes->length) {
                            $a = array();
                            foreach($node->attributes as $attrName => $attrNode) {
                                $a[$attrName] = (string) $attrNode->value;
                            }
                            $output['@attributes'] = $a;
                        }
                        foreach ($output as $t => $v) {
                            if(is_array($v) && count($v)==1 && $t!='@attributes') {
                                $output[$t] = $v[0];
                            }
                        }
                    }
                       break;
            }
            return $output;
        }
    }[本话题由 vb2005xu 于 2011-10-24 18:41:47 编辑]
你还不是该群组正式成员,不能参与讨论。 现在就加入