您尝试实现的目标(首先)可以通过使用 xpath 查询来实现。您想要根据属性值访问子节点。 SimpleXML 中比较好的参考问题是:
- 在 XPath 中实现条件 https://stackoverflow.com/q/3448005/367456
- SimpleXML根据属性值获取元素内容 https://stackoverflow.com/q/4736417/367456
也是从几天开始,就有人提出延长表格的建议SimpleXMLElement
提供一个实用函数,通过一个简单的界面来实际做到这一点:
- PHP/XML - 如何读取多个子内容 https://stackoverflow.com/a/16921116/367456
- simplexml_load_file - 具有空值的冗余元素转换为新的 SimpleXMLElement 对象 https://stackoverflow.com/a/17404930/367456
但是,由于您建议的语法,您的情况略有不同:
$xml = simplexml_load_string($buffer, 'MySimpleXMLElement');
echo $xml->Vehicle->Photo->attribute("order", "1")->Filename;
// prints "http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_2.jpg"
而不是使用普通的SimpleXMLElement
此示例使用名为(示例性)的扩展MySimpleXMLElement
。它根据输入参数和它所操作的父元素(这里是一个Photo
元素):
/**
* Class MySimpleXMLElement
*
* Example of how to magically access named child-nodes based
* on an attribute value of theirs.
*/
class MySimpleXMLElement extends SimpleXMLElement
{
public function attribute($name, $value) {
$nodes = $this->xpath(
sprintf('../%s[@%s = "%s"]', $this->getName(), $name, $value)
);
return $nodes ? $nodes[0] : NULL;
}
}
这个新的MySimpleXMLElement::attribute()
方法(抱歉attributes()已在使用 http://php.net/simplexmlelement.attributes) 然后在每个节点上都可用。所以玩得开心吧。
当然你也可以这样写:
$xml = simplexml_load_string($buffer);
echo $xml->Vehicle->xpath('Photo[@order="1"]')[0]->Filename;
// prints "http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_2.jpg"
扩展SimpleXMLElement主要是为了方便起见。如果您还不熟悉 Xpath,那么调试可能会更容易。
上次我在 Stackoverflow 上扩展 SimpleXMLElement 是在上述内容中回答“simplexml_load_file - 具有空值的冗余元素被转换为新的 SimpleXMLElement 对象”问题 https://stackoverflow.com/a/17404930/367456.