You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SimpleXML提取带属性XML的文本并用于Telegram?

解决PHP提取带属性XML节点中内容的问题

你遇到的问题其实是把SimpleXML对象转成数组时破坏了节点的原生结构导致的——这是处理XML时很容易踩的坑,咱们直接用SimpleXML的原生API就能轻松解决:

问题根源

你当前的代码把SimpleXML转成JSON再解码成数组,这会把带属性的节点(比如<zone id="809" name="AGi">)的结构彻底打乱:转成数组后,节点属性会被塞进@attributes子数组,而你试图用['zona id="809" nama="AGi"']这种不存在的键去访问,自然取不到目标内容。

解决方案:用SimpleXML原生方法定位节点

我们可以用XPath查询精准匹配带属性的节点,或者直接通过层级访问,以下是两种可行的修改方案:

方法1:XPath查询(推荐,适配多节点场景)

XPath能直接根据属性筛选节点,灵活性更强,适合XML里有多个同类型节点的情况:

function getIdTEXT($chatId){ 
    $context = stream_context_create(array('http' => array('header' => 'Accept: application/xml'))); 
    $url = "http://www.thexmlfile/MM.xml"; 
    $xmlstring = file_get_contents($url, false, $context); 
    // 加载XML并保留CDATA内容
    $xml = simplexml_load_string($xmlstring, "SimpleXMLElement", LIBXML_NOCDATA); 

    // 用XPath精准定位目标text节点
    // 注意:请核对XML里的节点名和属性名(你代码里的zona/nama可能是拼写错误)
    $textNodes = $xml->xpath('//trend/zone[@id="809" and @name="AGi"]/subzone[@id="809" and @name="AGi"]/text');
    
    if (!empty($textNodes)) {
        $textContent = (string)$textNodes[0]; // 转成字符串获取文本内容
        $info = "information: " . $textContent; 
        sendMessage($chatId, $info); 
    } else {
        // 处理节点不存在的异常情况
        sendMessage($chatId, "information: No matching text found");
    }
}

方法2:直接层级访问(适合结构固定的XML)

如果你的XML结构完全固定,<trend>下只有一个符合条件的<zone>和<subzone>,也可以直接按层级访问:

function getIdTEXT($chatId){ 
    $context = stream_context_create(array('http' => array('header' => 'Accept: application/xml'))); 
    $url = "http://www.thexmlfile/MM.xml"; 
    $xmlstring = file_get_contents($url, false, $context); 
    $xml = simplexml_load_string($xmlstring, "SimpleXMLElement", LIBXML_NOCDATA); 

    // 直接访问节点,通过属性匹配筛选
    $zone = $xml->trend->zone;
    if ((string)$zone['id'] === "809" && (string)$zone['name'] === "AGi") {
        $subzone = $zone->subzone;
        if ((string)$subzone['id'] === "809" && (string)$subzone['name'] === "AGi") {
            $textContent = (string)$subzone->text;
            $info = "information: " . $textContent; 
            sendMessage($chatId, $info); 
        }
    }
}

关键注意事项

  1. 核对节点/属性名:你代码里的zona、nama、nombre可能是拼写错误,请严格对应XML里的实际节点名和属性名,否则查询会失败。
  2. 强制类型转换:SimpleXML的节点和属性都是对象,必须用(string)转成字符串才能获取实际文本内容。
  3. 错误捕获:建议给file_get_contents和simplexml_load_string添加错误处理,避免网络故障或XML格式错误导致脚本崩溃。

内容的提问来源于stack exchange,提问作者I LB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:15:57