2011-08-20 100 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元素,上述功能可能會導致服務器應變。