PHP解析来自CDN Flush API的XML / String响应

时间:2012-10-04 11:09:31

标签: php xml api parsing simplexml

我正在向CDN API发出请求,该API刷新特定项目的缓存。我正在尝试正确解析响应,但不仅错误地返回响应(从我如何看到它),但我正在努力解析如此大量的信息。我的目的是从响应中获取一个不成功的刷新列表,以及任何错误代码。

这是您为其API处理请求而运行的网址:

https://openapi.us.cdnetworks.com/OpenAPI/services/CachePurgeAPI/executeCachePurge?userId=***&password=***&purgeUriList=http://urlhere.com?param1=here&param2=here&purgeUriList=http:://url2here.com?param1=here

文档说明响应是XML格式的。当您在浏览器中键入地址时就是这样。但是,从PHP执行请求会带回一些不是XML的东西。

应该如下所示:

但实际上我得到的是:

000REQUEST ACCEPTEDhttp://cdn.oursite.com/blah.php?alt=1&cid=6291&campaign=126400&width=25010REQUEST ACCEPTEDhttp://cdn.oursite.co.uk/blah.php?alt=1&cid=6292&campaign=126401&width=250122';

现在这只是两个成功刷新的示例。 API文档显示了可能返回的额外错误:

0: Successful; 2: Successful only in some URLs; 999: Temporary Error; 194 Too many URLs

我不想为每个单独的响应解析字符串。返回的第一部分是resultCode,第二部分是totalURLNum,第三部分是成功,第四部分是失败,然后是包含更多信息的结果列表。

我检索字符串的初始PHP代码:

一个简单的file_get_contents请求。

$result = file_get_contents(urlencode($url));

然后我得到了一些RED TEXT !!!

我使用cURL,CURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOST设置为false:

$aData = curl_exec($rData);

并返回红色文字:

string '<ns:executeCachePurgeResponse xmlns:ns="http://control.webif.server.openapi.cdnetworks.com"><ns:return xmlns:ax21="http://cachepurge.purge.response.server.openapi.cdnetworks.com/xsd" type="com.cdnetworks.openapi.server.response.purge.cachepurge.CachePurge"><ax21:failureURLNum>2</ax21:failureURLNum><ax21:resultCode>2</ax21:resultCode>(etc)(etc) (length=1678)

尝试使用SimpleXML:

所以我尝试在这上面使用simplexml。我试过了:

$xml = simplexml_load_string($aData);

$properties = $xml->xpath('//Property');

我尝试使用SimpleXML加载初始文件:

$result = simplexml_load_file($url)

我该如何解析这个?很明显,我没有像我想的那样回复XML,而字符串将成为解析的噩梦。

我目前的目标:

我在cURL输出上运行了以下PHP。

$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($aData);
$dom->formatOutput = TRUE;
echo $dom->saveXml();

这给了我一个稍微格式化的输出,但它仍然不是XML所以不容易解析!:

2 2 9999 Check your input. If it's not wrong, contact us please. http://cdn.whatever.co.uk/blah.php?alt=1&cid=6291&campaign=126400&width=250 0 0 REQUEST ACCEPTED http://cdn.whatever.co.uk/blah.php?alt=1&cid=6292&campaign=126401&width=250 1 9999 Check your input. If it's not wrong, contact us please. http://cdn.whatever.co.uk/blah.php?alt=1&cid=6291&campaign=126400&width=250 0 1 3

在XML的任意一侧使用<pre>,查看源代码,然后将代码放入XML验证器中,返回错误的xml。

可以检索命名空间,但是从XML中获取数据就可以了。 XML无效,开发团队正在研究这个问题。

2 个答案:

答案 0 :(得分:1)

听起来你正在尝试将XML直接回显到浏览器。如果你这样做,浏览器将假定它是HTML,并且任何XML标签都是不可见的,所以你只需看到它们之间的文本。

请尝试以下方法之一:

  • 使用HTML实体转义XML:echo htmlspecialchars($response)
  • 在浏览器中查看来源
  • 告诉浏览器您要为其提供XML,而不是HTML:header('Content-Type: text/xml');

答案 1 :(得分:0)

如果simplexml无法正确处理,则返回的“XML”无效。

尝试使用xml验证器确保您确实尝试解析有效​​的xml。