PHP - DOMDocument:输出不符合我编写的代码

时间:2015-07-31 08:12:55

标签: php xml domdocument

我的问题是我的输出不是我的代码。我在DOMDocument中创建了2个节点组件,并将它们附加到body元素中。但我的输出似乎只读取带有标记名称的完整节点的NodeValues instat。我试着看看在调试模式下会发生什么,但是当我在_render()方法中找到append子行时,在附加节点之前是完美的但是在appendeing之后它已经改变了。 ¿****错了什么?

/* 
 * Suposed output:
 * <?xml version="1.0"?>
 * <soap:Envelope>
 *   <soap:Header/>
 *   <soap:Body>
 *     <controller>DefaultController</controller>
 *     <version>2.0.0</version>
 *   </soap:Body>
 * </soap:Envelope>  
 * 
 * Real output:
 * <?xml version="1.0"?>
 * <soap:Envelope>
 *   <soap:Header/>
 *   <soap:Body>DefaultController2.0.0</soap:Body>
 * </soap:Envelope>  
 */

class foo
{
    var $version = '2.0';
    public function bar()
    {
        $soap = new SoapHandler();
        $tag = array();
        $tag[] = $soap->document->createElement('contoller', get_class($this));
        $tag[] = $soap->document->createElement('version', $this->version);
        $soap->Render($tag);
    }
}


class SoapHandler
{
    /** @var DOMDocument */
    var $document;

    /** @var DOMElement */
    var $envelope;

    /** @var DOMElement */
    var $header;

    /** @var DOMElement */
    var $body;

    /** @var DOMElement */
    var $faults;

    public function __construct()
    {
        $this->document = new DOMDocument();
        $this->envelope = $this->document->createElement('soap:Envelope');
        $this->header = $this->document->createElement('soap:Header');
        $this->body = $this->document->createElement('soap:Body');
        $this->faluts = $this->document->createElement('soap:Faults');
    }

    public function EnveloapSchema($url)
    {
        $this->envelope->setAttribute('xmlns:soap', $url);
    }

    public function EnveloapEncodingStyle($url) {
        $this->envelope->setAttribute('soap:encodingStyle', $url);
    }

    public function AppendHeader($name, $element)
    {
        $this->_render($name, $element, $this->header);
    }

    public function DeleteHeader($name, $index = NULL)
    {
        $elements = $this->header->getElementsByTagName($name);
        if (is_null($elements))
        {
            for ($i = 0; $i < $elements->length; $i++)
            {
                $this->header->removeChild($elements->item($i));
            }
            return TRUE;
        }
        elseif (is_int($index))
        {
            $this->header->removeChild($elements->item($index));
            return TRUE;
        }
        return FALSE;
    }

    public function AppendFaults($name, $element)
    {
        $faults = $this->faluts;
        $this->_render($name, $element, $this->faluts);
    }

    public function DeleteFaults($name, $index = NULL)
    {
        $elements = $this->faults->getElementsByTagName($name);
        if (is_null($elements))
        {
            for ($i = 0; $i < $elements->length; $i++)
            {
                $this->header->removeChild($elements->item($i));
            }
            return TRUE;
        }
        elseif (is_int($index))
        {
            $this->header->removeChild($elements->item($index));
            return TRUE;
        }
        return FALSE;
    }

    public function Render($content = NULL)
    {
        if (is_null($content))
        {
            $content = "";
        }
        ResponseHandler::write('Headers.ContentType', 'Content-type: application/soap+xml; charset=utf8');
        $faults = ResponseHandler::get_log("exceptions");
        $this->_render_to_parent($content, $this->body);
        $this->_render_to_parent($faults, $this->body);
        $this->envelope->appendChild($this->header);
        $this->envelope->appendChild($this->body);
        $this->document->appendChild($this->envelope);
        ResponseHandler::set_output_string($this->document->saveXML());
    }

    /**
     * 
     * @param string $tagname
     * @param DOMElement $node
     * @param DOMElement $parent
     */
    private function _render($tagname, $node, &$parent)
    {
        if (is_object($node) && get_class($node) == 'DOMElement')
        {
            $parent->appendChild($node);
        }
        elseif (is_array($node))
        {
            if (isset($node['NodeValue']))
            {
                $this->_render_node($tagname, $node, $parent);
            }
            else
            {
                $this->_render_tree($tagname, $node, $parent);
            }
        }
        else
        {
            $tag = $this->document->createElement($tagname);
            $tag->nodeValue = print_r($node, TRUE);
            $parent->appendChild($tag);
        }
    }

    /**
     * 
     * @param string $tagname
     * @param DOMElement $node
     * @param DOMElement $parent
     */
    private function _render_tree($tagname, $node, &$parent)
    {
        $tag = $this->document->createElement($tagname);
        foreach ($node as $key => $value)
        {
            $this->_render($key, $value, $tag);
        }
        $parent->appendChild($tag);
    }

    /**
     * 
     * @param string $tagname
     * @param DOMElement $node
     * @param DOMElement $parent
     */
    private function _render_node($tagname, $node, &$parent)
    {
        $tag = $this->document->createElement($tagname);
        foreach ($node as $key => $value)
        {
            if (!$key == 'NodeValue')
            {
                $tag->setAttribute($key, $value);
            }
        }
        $this->_render_to_parent($node['NodeValue'], $parent);
        $parent->appendChild($tag);
    }

    private function _render_to_parent($node, &$parent)
    {
        if (is_object($node) && get_class($node) == 'DOMElement')
        {
            $parent->appendChild($node);
        }
        elseif (is_array($node))
        {
            foreach ($node as $key => $value) 
            {
                $this->_render($key, $value, $parent);
            }
        }
        else
        {
            $parent->nodeValue .= print_r($node, TRUE);
        }
    }
}

0 个答案:

没有答案