simplexml_load_string没有解析我的XML字符串。 Charset问题?

时间:2013-09-06 22:24:08

标签: php simplexml xml-namespaces noaa

我正在使用以下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数组,只是没有任何内容!

1 个答案:

答案 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_dumpHere's a live demo with your code and simplexml_dump更具误导性。