2011-08-20 59 views
0

如何通过Curl发送SimpleXmlElement对象使用POST请求类型并接收SimpleXmlElement对象返回。使用POST请求通过卷发发送SimpleXmlElement

我在本地服务器上创建了两个文件并创建了对象。

网址:

  • http://someaddress/fileOne.php
  • http://someaddress/fileTwo.php

对象从第一个文件:

$Xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><SomeXml></SomeXml>'); 
$Translation = $Xml->addChild('Translation'); 
$Translation->addChild('Phrase', 'test'); 

,现在我想通过卷曲发送此$Xml对象和解析它在其他文件中发回

$Xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><SomeXml></SomeXml>'); 
$Translation = $Xml->addChild('Translation'); 
$Translation->addChild('Phrase', "Got your phrase: $phrase"); 

如果您能提供代码示例,我将非常感激。 谢谢大家的帮助。

+0

好的,我们有你想要的。现在我们想知道,你有什么尝试? :) – Shef

+0

我有我自己的书面卷曲类,可悲的是它是私人的。试图用它来发送这个对象,但正如我从答案中理解的那样,发送对象是不可能的。 – Eugene

回答

2

您不会发送SimpleXMLElement对象,您将发送XML数据。

从你的发送端,您可以:

$xml = '<?xml version="1.0" encoding="UTF-8"?><SomeXml></SomeXml>'; 

// assuming you have a previously initialized $curl_handle 
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $xml); 
从接收端

那么你将刚才得到的请求,并使用SimpleXML解析它。

+0

换句话说,发送对象是不可能的。只有一个字符串,然后转换为另一边的对象?该字符串可以多久?我可以序列化对象并发送它,否则它会更大? – Eugene

+0

你可以序列化对象,但是PHP的序列化支持有其局限性。 XML是专为做你想做的事情而设计的;传输数据。发送序列化的SimpleXML对象由于许多原因并没有多大的技术意义。 – SuitedSloth

+1

如果你使用php5,我建议你看看altumo库的curl抽象类(https://github.com/homer6/altumo/blob/master/source/php/Http/OutgoingHttpRequest.php)它使卷曲工作变得更容易。它还提供了一个XmlElement类来缓解Xml操作(https://github.com/homer6/altumo/blob/master/source/php/Xml/XmlElement.php) – SuitedSloth

1

可以通过cURL传递的唯一数据类型是字符串。你可以使用分析功能,如下面的内容(编号:http://www.nicolaskuttler.com/post/php-innerhtml/

function innerHTML($contentdiv) { 
      $r = ''; 
      $elements = $contentdiv->childNodes; 
      foreach($elements as $element) { 
        if ($element->nodeType == XML_TEXT_NODE) { 
          $text = $element->nodeValue; 
          // IIRC the next line was for working around a 
          // WordPress bug 
          //$text = str_replace('<', '&lt;', $text); 
          $r .= $text; 
        }  
        // FIXME we should return comments as well 
        elseif ($element->nodeType == XML_COMMENT_NODE) { 
          $r .= ''; 
        }  
        else { 
          $r .= '<'; 
          $r .= $element->nodeName; 
          if ($element->hasAttributes()) { 
            $attributes = $element->attributes; 
            foreach ($attributes as $attribute) 
              $r .= " {$attribute->nodeName}='{$attribute->nodeValue}'" ; 
          }  
          $r .= '>'; 
          $r .= $this->innerHTML($element); 
          $r .= "</{$element->nodeName}>"; 
        }  
      }  
      return $r; 
    } 

然后进行urlencode(innerHTML的($ XML)),并通过卷曲。

一句警告 - 如果您正在处理大型DOM元素,上述功能可能会导致服务器应变。