WordPress PHP中如何读取外部API返回XML的子元素数据?
解决XML中FullName字段的读取问题
你的问题核心出在XML命名空间未处理和JSON转换导致的结构认知错误上,以下是具体修正方案:
问题拆解
- 目标XML的根节点
ResponseDS带有默认命名空间http://tempuri.org/,SimpleXML默认不会自动识别命名空间,直接访问节点会失效 - 将SimpleXMLElement转JSON再解析属于冗余操作,不仅会丢失命名空间信息,还会改变原XML的节点层级结构,导致你写的访问路径完全错误
方案一:直接用SimpleXML处理命名空间(推荐)
通过注册命名空间+XPath定位,无需多余转换:
$xml = wp_remote_retrieve_body($response); $xmlObj = simplexml_load_string($xml); // 注册默认命名空间,前缀可自定义(示例用`t`) $xmlObj->registerXPathNamespace('t', 'http://tempuri.org/'); // 用XPath精准定位FullName节点 $fullNameNodes = $xmlObj->xpath('//t:DS/diffgr:diffgram/NewDataSet/Table/FullName'); if (!empty($fullNameNodes)) { $name = (string)$fullNameNodes[0]; echo "<h2>$name</h2>"; // 输出:Prof. Phil Brown }
方案二:修正JSON转换后的访问路径(不推荐)
如果坚持要转JSON,需修正节点访问路径:
$xml = wp_remote_retrieve_body($response); $xmlObj = simplexml_load_string($xml); $json = json_encode($xmlObj); $data = json_decode($json); // 正确路径:根节点直接对应DS等子节点,不存在`object`层级 $name = $data->DS->diffgram->NewDataSet->Table->FullName; echo "<h2>$name</h2>";
方案三:用DOMDocument解析
若对XPath更熟悉,可使用DOMDocument实现:
$xml = wp_remote_retrieve_body($response); $dom = new DOMDocument(); $dom->loadXML($xml); $xpath = new DOMXPath($dom); // 注册命名空间 $xpath->registerNamespace('t', 'http://tempuri.org/'); $fullNameNode = $xpath->query('//t:DS/diffgr:diffgram/NewDataSet/Table/FullName')->item(0); if ($fullNameNode) { $name = $fullNameNode->nodeValue; echo "<h2>$name</h2>"; }
内容的提问来源于stack exchange,提问作者Affan Abbas
相关产品推荐
相关产品推荐

