simplexml_load_string不解析我的XML字符串。 字符集问题?(simplex

2019-10-18 14:44发布

我使用下面的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阵列,只是什么也没有!

Answer 1:

你被忽悠了(并有我上当)由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?