PHP解析来自CDN Flush API的XML /字符串响应

问题描述:

我正在向CDN API发出请求,该请求会刷新特定项目的缓存。我试图正确解析响应,但不仅错误地返回了响应(从我如何看待它),但我正在努力解析如此大量的信息。我的目标是获得响应中不成功的清除列表以及任何错误代码。PHP解析来自CDN Flush API的XML /字符串响应

这是你为他们的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));

然后我得到了一些红色文本回!

我用卷曲带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,而字符串将成为解析的噩梦。

目前我到什么:

我跑卷曲输出以下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无效,开发团队正在研究这个问题。

返回的“XML”是无效的,如果它不能得到妥善的处理的SimpleXML。

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

+0

从这个问题来看,很明显,提问者没有从XML解析器中获取错误,他们只是试图回显解析的XML,而不理解他们正在看什么。 – IMSoP

+0

尝试多次尝试使用返回的XML后,事实证明它并不是真正有效的XML,因此无法使用典型库进行搜索。我明白我在用XML看什么。我的答案不值得赞扬。 – Jimbo

+0

除了最近的编辑之外,问题中没有任何内容提示您尝试使用Web浏览器显示原始XML时出现的任何错误。没有XML样本,也没有错误消息,并且您反复提到“红色文本” - 一串文本没有颜色,所以这强烈建议您没有看到真实的回复。你最后一个使用DOM函数的例子似乎表明解析是成功的。 – IMSoP

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

请尝试以下之一:

  • 逃生用HTML实体的XML:echo htmlspecialchars($response)
  • 查看源代码在浏览器中
  • 告诉浏览器,你给它的XML,而不是HTML:header('Content-Type: text/xml');