PHP无法从指定URL解析XML并提取<raw_text>内容的技术求助
解决从Aviation Weather获取METAR数据的问题
我来帮你排查代码里的问题,然后给出可行的解决方案:
你的代码里存在的几个关键问题:
- URL参数编码错误:你URL里的
&是HTML实体编码,实际在PHP字符串中需要换成普通的&,否则服务器无法正确解析请求参数。 - 重复XML解析操作:
simplexml_load_file($url)已经直接返回了SimpleXMLElement对象,不需要再把它转成字符串然后用simplexml_load_string重复解析,这会导致对象类型错误。 - 请求被服务器拦截:很多公共API会拒绝没有User-Agent标识的请求,PHP的
file_get_contents或simplexml_load_file默认不带User-Agent,这很可能是你拿不到数据的核心原因。
修正后的可行代码:
<?php // 修正URL,将HTML实体&替换为正常的& $url = 'https://www.aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&hoursBeforeNow=3&mostRecent=true&stationString=KORL'; // 创建请求上下文,添加User-Agent模拟浏览器请求,避免被拦截 $context = stream_context_create([ 'http' => [ 'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' ] ]); // 加载XML文件,传入上下文信息 $xml = simplexml_load_file($url, 'SimpleXMLElement', LIBXML_NOCDATA, $context); if ($xml === false) { die('无法加载XML数据,请检查请求URL或网络连接'); } // 按照XML层级正确获取raw_text内容 // XML结构:根节点response -> data -> METAR -> raw_text $rawText = (string)$xml->data->METAR->raw_text; echo $rawText; ?>
代码说明:
- 修正URL参数:把所有
&替换为&,确保服务器能识别每个请求参数。 - 添加User-Agent:通过
stream_context_create设置请求头,模拟正常浏览器请求,避免被服务器的反爬机制拦截。 - 正确遍历XML结构:根据目标XML的层级关系,直接访问
raw_text节点并转换为字符串类型。
如果还是无法获取数据,可以先在浏览器里打开修正后的URL,确认是否能正常返回XML内容。如果浏览器可以访问但代码不行,可能需要检查你的服务器是否有对外API访问的网络限制。
内容的提问来源于stack exchange,提问作者failed_colonizer
相关产品推荐
相关产品推荐

