无法获取嵌套的 SimpleXMLElement 的属性

Cannot get attributes of nested SimpleXMLElement

显然我遗漏了一些简单的东西。

我有以下 xml 字符串,我使用 simplexml_load_string:

对其进行解析
$xmlString = '<root><Title>Heading Text</Title><Image><img src="https://image.com?id=123" alt="alt text" /></Image></root>';

$xml = simplexml_load_string($xmlString);

但是,我无法访问 Image 中的 img 标签。

我想我会使用 $xml->Image[0]->img 来获取元素和 $xml->Image[0]->img['src'] 获取图像的 url。但我不断收到错误消息:

Trying to get property 'img' of non-object

$xml->Image[0] 测试为 SimpleXMLElement 类型,当我 print_r() 我得到:

SimpleXMLElement Object (     
  [img] => SimpleXMLElement Object (             
    [@attributes] => Array (
       [src] => https://image.com?id=123
       [alt] => alt text 
    )          
  )  
)

就像我说的,我知道我遗漏了一些非常明显的东西,所以我们将不胜感激。

你是对的,$xml->Image[0]->img['src'] 会给你 src 属性,但它会给你 作为 object

如果你 运行 print_r($xml->Image[0]->img['src']); 它会显示这个:

SimpleXMLElement Object
(
    [0] => https://image.com?id=123
)

但是如果你 运行 echo $xml->Image[0]->img['src']; 相反,它会给你这个:

https://image.com?id=123

原因是 the SimpleXMLElement class 实现了魔术重载方法 __toString(或内部 C 代码中的等效方法),因此无论何时将 object 转换为字符串,它都会给你字符串内容。由于 echo 总是需要一个字符串,它隐式地执行此操作,但您可以使用 (string) 显式地执行此操作,例如:

$imageSrc = (string)$xml->Image[0]->img['src'];
var_dump($imageSrc);

(作为 side-note,[0] 始终是可选的 - 如果您不提供数字,SimpleXML 假定您想要唯一或第一个具有该名称的 child,所以 $xml->Image->img['src']$xml->Image[0]->img['src']$xml->Image->img[0]['src']$xml->Image[0]->img[0]['src'] 都会给出相同的结果。)