为什么通过 属性 访问提取 XML 字段值不返回值?

Why is extracting an XML field value by property access not returning a value?

所以,我有这个 XML:http://mkweb.bcgsc.ca/color_summarizer/?xml=1&url=http://i.imgur.com/I1phTe1.png&precision=extreme

我正在尝试提取 hexrgb 及其 avg。所以在这种情况下,它将是 d7dfe2

从这里读到:

这是我目前的情况:

$feed = file_get_contents("http://mkweb.bcgsc.ca/color_summarizer/?xml=1&url=http://i.imgur.com/I1phTe1.png&precision=extreme");
$xml = simplexml_load_string($feed);
echo $xml->imgdata->variable[9]->statistic[0]->hex;

然而,它returns空白。

我做错了什么?

您可以使用 SimpleXMLElement::xpath() 传递合适的 XPath 表达式来获取目标文本:

$feed = file_get_contents("http://mkweb.bcgsc.ca/color_summarizer/?xml=1&url=http://i.imgur.com/I1phTe1.png&precision=extreme");
$xml = simplexml_load_string($feed);
echo $xml->xpath("//variable[@name='rgb']/statistic[@name='avg']/hex")[0];

关于 XPath 表达式的简要说明:

  • //variable[@name='rgb'] : 在 XML 文档中的任何位置找到 variable 元素,其属性 name 值等于 "rgb"
  • /statistic[@name='avg'] : 从这样的 variable 元素中找到具有属性 name 值等于 "avg"
  • 的子元素 statistic
  • /hex : 从这样的 statistic 元素, return 子元素 hex
echo $xml->imgdata->variable[9]->statistic[0]->hex;
           ^^^^^^^

这就是你出错的地方 – imgdata 是你的 XML 的根元素,所以你的 $xml 变量已经“指向”那个。

echo $xml->variable[9]->statistic[0]->hex;

– 这将为您提供输出 d6dfe2.


使用 var_dump 而不是 echo 将得到

object(SimpleXMLElement)#2 (1) {
  [0]=>
  string(8) "
d6dfe2
"
}

– 所以你看到它仍然是一个 SimpleXMLElement 对象,并且节点值包括原始 XML 数据中存在的空白。因此,在进一步处理之前,您可能还想将其转换为字符串 trim:

trim((string)$xml->variable[9]->statistic[0]->hex)