Отправить SimpleXmlElement через Curl, используя запрос POST - PullRequest
1 голос
/ 20 августа 2011

Как я могу отправить SimpleXmlElement объект через Curl, используя POST тип запроса и получить SimpleXmlElement объект обратно.

Я сделал два файла на локальном сервере и создал объект.

URL:

  • 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 объект через curl, проанализировать его в другом файле и отправить обратно

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

Я был бы очень признателен, если бы вы могли предоставить примеры кода.Спасибо всем за помощь.

Ответы [ 2 ]

2 голосов
/ 20 августа 2011

Вы не отправите объект 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.

1 голос
/ 20 августа 2011

Единственный тип данных, который можно передать через cURL, - это строка. Вы можете проанализировать элементы, используя функцию, подобную приведенной ниже (ref: 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)) и пройти через curl.

Предупреждение: если вы работаете с большим элементом DOM, указанная выше функция может вызвать перегрузку сервера.

...