使用CURL返回XML响应

Jac*_*man 2 php xml curl

我通过HTTP POST将一些参数传递给网络服务器.

我得到了一个响应,但理想情况下我想要一个完整的XML响应,而我似乎只得到一个连接的字符串.我已经尝试过SimpleXMLElement,但它似乎没有做任何事情,并且它没有返回任何XML.

以下是我的代码:

$post_string = '<?xml version="1.0" encoding="utf-16" ?> 
<ChameleonIAPI>
  <Method>TitleList</Method> 
  <APIKey>D12E9CF3-F742-47FC-97CB-295F4488C2FA</APIKey> 
  <UserName>David</UserName>
  <Filter>
  </Filter>
</ChameleonIAPI>';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"https://jobs.chameleoni.com/PostXML/PostXml.aspx");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
        "Action=postxml&AuthKey=Guest&AuthPassword=KgwLLm7TL6G6&Xml=$post_string");

// receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true);

$server_output = curl_exec ($ch);

echo $server_output." TEST <br />";
curl_close ($ch);

$oXML = new SimpleXMLElement($server_output);

foreach($oXML->entry as $oEntry){
  echo $oEntry->title . "\n";
}
Run Code Online (Sandbox Code Playgroud)

这是您甚至可以测试POST和XML的页面.

https://jobs.chameleoni.com/PostXML/PostingXML.html

我的XML似乎没问题,因为它适用于测试页面.我认为我的PHP有问题,虽然我不知道那是什么!

任何帮助都很可爱!

fus*_*n3k 7

您的代码检索完整的XML,看它写:

echo htmlentities( $server_output );
die();
Run Code Online (Sandbox Code Playgroud)

在浏览器中你会看到:

<?xml version ="1.0"encoding ="utf-16"?> <ChameleonIAPIResponse>

<标题> <TitleId> 1 </ TitleId> <TITLE> </ TITLE> <TitleId> 6 </ TitleId> <TITLE>先生</ TITLE> <TitleId> 2 </ TitleId> <TITLE>杜</ TITLE> <TitleId> 3 </ TitleId> <TITLE>小姐</ TITLE> <TitleId> 4 </ TitleId> <TITLE>女士</ TITLE> <TitleId> 5 </ TitleId> <TITLE>博士</ TITLE> <TitleId > 43 </ TitleId> <Title> Sir </ Title> </标题> </ ChameleonIAPIResponse>

问题是浏览器将您的输出解释为HTML,因此隐藏了标记(请参阅浏览器页面源,您将找到完整的XML).

此外,要在发送适当的标头之前将XML作为XML发送:

header( 'Content-type: text/xml' );
echo $server_output;
die();
Run Code Online (Sandbox Code Playgroud)

在上面的代码之前和之后没有其他输出,否则你的XML将被破坏.

如果您更喜欢SimpleXML,您可以这样做:

$oXML = new SimpleXMLElement( $server_output );
header( 'Content-type: text/xml' );
echo $oXML->asXML();
die();
Run Code Online (Sandbox Code Playgroud)

同样在这种情况下,之前和之后没有输出(所以注释前面的行).