我的问题是我的输出不是我的代码。我在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);
}
}
}