一個簡易的PHP XML 操作類SmallXmlDOM

vb2005xu 12年前發布 | 12K 次閱讀 開源項目提交群組

<?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 編輯]

 本文由用戶 vb2005xu 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!