2015-02-10 93 views
0

我有一个控制器使用HTTP套接字发送请求,并以xml格式给出响应。我正在使用cakephp 2.6。
这里是我的代码,以获得响应正文:从HTTP套接字响应中获取XML元素的值

$HttpSocket = new HttpSocket();    
    $response = $HttpSocket->request($request); 
    $resulthit = $response->body; 

当我尝试打印响应体,它返回这在我的浏览器:

-2201502101153512eFXcByWLUHvQmYC0EHMn2JVxcpyzozBcek uid dan pwd 

但是,当我看着页面的源代码,这是我看到的:

<? xml version="1.0" ?> 
    <PUSH> 
    <STATUS>-2</STATUS> 
    <SMSCMESSAGEID>20150210133953</SMSCMESSAGEID> 
    <GUID>knDlIBuUZf6zixlhbbxxLoxhEUGZTWPD</GUID> 
    <MSG>cek uid dan pwd</MSG> 
    </PUSH> 

我怎样才能获得XML元素的价值?
我想要STATUS和GUID。

我已经尝试过:

$xml = new SimpleXMLElement($resulthit); 

但我只在回报说

"String could not be parsed as XML" 
+0

你应该得到很多警告,解释什么是错的,而不仅仅是那个异常信息。 [**处理指令目标**之前的空间](http://stackoverflow.com/questions/1495578​​9/solved-xml-cant-be-opened-in-a-browser)是不允许的。 – ndm 2015-02-10 07:10:16

+0

是的,你是正确的,但不幸的是,我用于Http Socket的主机只给我这个回应,我没有授权编辑给出回应的文件 – Angelina 2015-02-10 07:17:56

+0

那么,如果这真的是他们回来的,那么你应该告诉他们他们的API有问题,需要修复。 – ndm 2015-02-10 07:21:17

回答

1

可以使用CakePHP的XML类得到一个错误:CakePHP XML class

的原因代码不能被解析为XML,因为你有围绕它的pre>标签,我猜是因为你正在尝试调试($ something)。

在控制器的顶部包括XML类:

//First Load the Utility Class 
App::uses('Xml', 'Utility'); 

控制器操作执行以下操作:

$this->autoRender = false; 
pr(Xml::toArray(Xml::build($thexmlvariable))); 

这样,你可以测试它,那么你应该使用Ajax布局(空白布局)。

+0

感谢您的回答, 我已经尝试过,但返回错误消息:“XML无法读取” – Angelina 2015-02-10 07:31:03

+0

您是否尝试过简单地在URL上使用file_get_contents?只要服务器返回有效的XML,那么XML类应该能够构建它并将其输出为数组 – Voycey 2015-02-10 07:36:23

1

好了,最后我跳到结论,我从Http响应得到的xml无效,由于'处理指令目标之前的空间' 我试着用另一个'虚拟文件响应'与有效的xml,它给了我我想要的。