【问题标题】:PHP/SOAP/XML: How should this XML be parsed?PHP/SOAP/XML:应该如何解析这个 XML?
【发布时间】:2013-06-06 16:30:17
【问题描述】:

这是我无法解析的 XML SOAP 响应的一部分:

<soap:Envelope><soap:Body><getTrainScheduleXMLResponse><getTrainScheduleXMLResult><STATION><STATION_2CHAR>NY</STATION_2CHAR><STATIONNAME>New York Penn Station</STATIONNAME><ITEMS><ITEM><ITEM_INDEX>0</ITEM_INDEX><SCHED_DEP_DATE>18:08:00 06/10/2013</SCHED_DEP_DATE><DESTINATION>MSU</DESTINATION><TRACK>6</TRACK><LINE>MNBTN</LINE><TRAIN_ID>6279</TRAIN_ID><STATUS>ALL ABOARD</STATUS><BACKCOLOR>brown</BACKCOLOR><FORECOLOR>white</FORECOLOR><SHADOWCOLOR>black</SHADOWCOLOR><GPSLATITUDE/><GPSLONGITUDE/><GPSTIME>6/10/2013 5:45:30 PM</GPSTIME><TRAIN_LINE>Montclair-Boonton Line</TRAIN_LINE><STATION_POSITION>0</STATION_POSITION><LINEABBREVIATION>MNBTN</LINEABBREVIATION><INLINEMSG/><STOPS><STOP><NAME>Newark Broad Street</NAME><TIME>6/10/2013 6:25:00 PM</TIME></STOP><STOP><NAME>Watsessing Avenue</NAME><TIME>6/10/2013 6:31:30 PM</TIME></STOP><STOP><NAME>Bloomfield</NAME><TIME>6/10/2013 6:34:00 PM</TIME></STOP><STOP><NAME>Glen Ridge</NAME><TIME>6/10/2013 6:36:30 PM</TIME></STOP><STOP><NAME>Bay Street</NAME><TIME>6/10/2013 6:39:30 PM</TIME></STOP><STOP><NAME>Walnut Street</NAME><TIME>6/10/2013 6:43:00 PM</TIME></STOP><STOP><NAME>Watchung Avenue</NAME><TIME>6/10/2013 6:45:30 PM</TIME></STOP><STOP><NAME>Upper Montclair</NAME><TIME>6/10/2013 6:48:30 PM</TIME></STOP><STOP><NAME>Mountain Avenue</NAME><TIME>6/10/2013 6:51:00 PM</TIME></STOP><STOP><NAME>Montclair Heights</NAME><TIME>6/10/2013 6:53:30 PM</TIME></STOP><STOP><NAME>Montclair State U</NAME><TIME>6/10/2013 6:59:00 PM</TIME></STOP></STOPS></ITEM>

我试过这样做:

$xmlstr = file_get_contents("data.xml");
$xml = new SimpleXMLElement($xmlstr);
var_dump($xml);

但它会返回以下输出:

object(SimpleXMLElement)#1 (0) {
}

我认为它是空的?如何在 PHP 中解析这个 XML?这不是提供的完整文件。谢谢!

【问题讨论】:

  • 你读过 PHP SoapClient 类吗?您最初是如何收到此请求的?您不必尝试手动使用 SOAP 响应,但它的名称空间可能会欺骗事情。 stackoverflow.com/questions/4194489/how-to-parse-soap-xml
  • 看看SimpleXMLElement的基本用法:) php.net/manual/en/simplexml.examples-basic.php
  • @Scuzzy 我正在执行一个请求 XML 的 SOAP 请求。我将输出保存到一个文件中,这样我就可以在不影响服务器的情况下解析它。
  • 我已在本地运行您的代码,但收到错误“未定义信封上的命名空间前缀 soap”,这表示没有 xmlns 属性。我可以建议您设置一个模拟版本的 SOAP 服务器,连接到该服务器并让它简单地回显您的预设响应(可能需要设置 http 标头)。
  • @Edward 是的,它让生活变得如此轻松,因为您根本不必管理请求的传输,这一切都由肥皂客户端类完成。

标签: php xml soap


【解决方案1】:

这非常有技巧,因为理想情况下您应该使用 SoapClient 类来处理 Soap 请求,但是如果您要去除 soap 命名空间,您应该能够通过 simpleXML 提供您的请求

$xml = new SimpleXMLElement(str_replace('<soap:','<',$xmlstr));

如果您已获得 WSDL,则要使用肥皂服务可能就像...

$client = new SoapClient('http://www.domain.com/service/soap.wsdl');
$result = $client->someMethodCall($params,$params);

【讨论】:

  • 如何发送 SOAP 请求?我已经为它格式化了 XML,但最终使用了我不想做的 CURL。有没有办法将此请求与新的 SoapClient 函数一起发送到 URL?
  • 好吧,所以不要把 Soap 想成是处理原始 XML,你可以根据 Web 服务 API 的要求将参数或对象输入到 SoapClient 中,然后它会返回一个对象化的回复。让我们把它移出问题页面chat.stackoverflow.com/rooms/31554/…
猜你喜欢
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 2011-05-10
  • 1970-01-01
相关资源
最近更新 更多