【问题标题】:Cannot get attributes of nested SimpleXMLElement无法获取嵌套 SimpleXMLElement 的属性
【发布时间】:2020-08-28 18:57:42
【问题描述】:

显然我错过了一些简单的东西。

我有以下使用 simplexml_load_string 解析的 xml 字符串:

$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-&gt;Image[0]-&gt;img 来获取元素和 $xml-&gt;Image[0]-&gt;img['src'] 获取图片的网址。但我不断收到错误:

试图获取非对象的属性“img”

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

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

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

【问题讨论】:

  • echo $xml-&gt;Image-&gt;img['src'];
  • @NigelRen 应该和$xml-&gt;Image[0]-&gt;img['src']一样吧?
  • @IMSoP,不确定实际问题是什么,因为他们报告收到错误Trying to get property 'img' of non-object
  • @IMSoP,但这不也是您回答的基础吗?
  • @NigelRen 我同意这个问题不清楚,但你的评论更不清楚。您是说“删除 [0] 将解决您的问题”(错误)“echo 将解决您的问题”(有点正确),还是只是“尝试使用 echo 进行调试”(如果您真的说过会很有帮助)?

标签: php xml simplexml


【解决方案1】:

你是对的,$xml-&gt;Image[0]-&gt;img['src'] 会给你src 属性,但它会作为一个对象给你。

如果你运行print_r($xml-&gt;Image[0]-&gt;img['src']);,它会告诉你这个:

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

但如果你改为运行echo $xml-&gt;Image[0]-&gt;img['src'];,它会给你这个:

https://image.com?id=123

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

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

(作为旁注,[0] 始终是可选的 - 如果您不提供数字,SimpleXML 假定您想要具有该名称的唯一或第一个孩子,因此 $xml-&gt;Image-&gt;img['src']$xml-&gt;Image[0]-&gt;img['src']、@ 987654335@ 和 $xml-&gt;Image[0]-&gt;img[0]['src'] 都会给出相同的结果。)

【讨论】:

  • 感谢您的完整解释。这让我意识到我没有疯。问题是我正在迭代生成的内容,其中一次通过 Image 标签丢失了关联的 img。我为那个 添加了一个测试,一切都检查出来了。
猜你喜欢
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
相关资源
最近更新 更多