我使用下面的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);
不幸的是,我结束了它显示此:
对象(的SimpleXMLElement)#246(0){}
在我看来像XML是完美地形成 - 为什么不这样解析? 通过观察另一个问题( Simplexml_load_string()无法解析错误 )我的想法,头部可能是问题- HTTP调用确实返回“ISO-8859-1”的字符集值。 但是,增加的utf8_encode()
调用似乎并没有这样的伎俩。
什么是特别令人困惑的是, simplexml_load_string()
实际上并没有失败-它返回一个开朗XML阵列,只是什么也没有!
你被忽悠了(并有我上当)由SimpleXML的书中最古老的伎俩:SimpleXML的不解析整个文档转换为PHP对象,它提出了一个PHP的API的内部结构。 像功能var_dump
不能看到这个结构,所以不要总是给一个什么样的对象中的一个有用的想法。
它看起来“空”的原因是,它是上市的根元素是其默认命名空间中的孩子 - 但目前还没有任何,他们都在“soapenv:”命名空间。
要访问命名空间的元素,你需要使用的children()
方法 ,传递完整的命名空间名称(推荐)或本地前缀(简单,但可以通过改变在文件中生成的另一端的方式被打破)。 要切换回“默认命名空间”,使用->children(null)
。
所以,你可以得到的ID
的第一属性stationV2
像这样(元素现场演示 ):
// 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'];
我已经写了一些调试功能与SimpleXML来使用这应该是比误导少得多var_dump
等这里是你的代码,并进行现场演示simplexml_dump
。
文章来源: simplexml_load_string not parsing my XML string. Charset issue?