我正在使用以下PHP代码从NOAA的潮汐报告站API读取XML数据:
$rawxml = file_get_contents(
"http://opendap.co-ops.nos.noaa.gov/axis/webservices/activestations/"
."response.jsp?v=2&format=xml&Submit=Submit"
);
$rawxml = utf8_encode($rawxml);
$ob = simplexml_load_string($rawxml);
var_dump($ob);
不幸的是,我最终还是显示了这个:
object(SimpleXMLElement)#246(0){}
在我看来,XML非常完美 - 为什么不解析这个?从另一个问题(Simplexml_load_string() fail to parse error)开始,我认为标题可能是问题 - http调用确实返回了字符串值“ISO-8859-1”。但是添加utf8_encode()
调用似乎没有办法解决问题。
特别令人困惑的是simplexml_load_string()
实际上并没有失败 - 它返回一个欢快的XML数组,只是没有任何内容!
答案 0 :(得分:3)
你被SimpleXML书中最古老的技巧所欺骗(并且让我上当了):SimpleXML不会将整个文档解析为PHP对象,它为内部结构提供了一个PHP API。像var_dump
这样的函数看不到这个结构,因此不要总是对对象中的内容有所了解。
它看起来“空”的原因是它列出了根元素的子元素,这些元素位于默认命名空间中 - 但是没有,它们都在“soapenv:”命名空间中。
要访问命名空间元素,您需要使用the children()
method,传入完整的命名空间名称(推荐)或其本地前缀(更简单,但可以通过更改文件生成的方式来破坏另一端)。要切换回“默认命名空间”,请使用->children(null)
。
因此,您可以获得第一个ID
元素的stationV2
属性(live demo):
// Define constant for the namespace names, rather than relying on the prefix the remote service uses remaining stable
define('NS_SOAP', 'http://schemas.xmlsoap.org/soap/envelope/');
// Download the XML
$rawxml = file_get_contents("http://opendap.co-ops.nos.noaa.gov/axis/webservices/activestations/response.jsp?v=2&format=xml&Submit=Submit");
// Parse it
$ob = simplexml_load_string($rawxml);
// Use it!
echo $ob->children(NS_SOAP)->Body->children(null)->ActiveStationsV2->stationsV2->stationV2[0]['ID'];
我写过some debugging functions to use with SimpleXML,这应该比var_dump
等Here's a live demo with your code and simplexml_dump
更具误导性。