使用attribute定位xml节点,然后使用simpleXML返回不同属性的值

时间:2011-08-05 20:53:39

标签: php xml xpath simplexml

我有一些xml:

<release id="2276808" status="Accepted">
    <images>
         <image height="600" type="primary" uri="http://s.dsimg.com/image/R-2276808-1302966902.jpeg" uri150="http://s.dsimg.com/image/R-150-2276808-1302966902.jpeg" width="600"/>                       
         <image height="600" type="secondary" uri="http://s.dsimg.com/image/R-2276808-1302966912.jpeg" uri150="http://s.dsimg.com/image/R-150-2276808-1302966912.jpeg" width="600"/>  
         <image height="600" type="secondary" uri="http://s.dsimg.com/image/R-2276808-1302966919.jpeg" uri150="http://s.dsimg.com/image/R-150-2276808-1302966919.jpeg" width="600"/><image height="600" type="secondary" uri="http://s.dsimg.com/image/R-2276808-1302966929.jpeg" uri150="http://s.dsimg.com/image/R-150-2276808-1302966929.jpeg" width="600"/>
    </images> ...

我正在使用SimpleXML和php 5.3。

我希望将image节点定位到type="primary",并返回uri属性的值。

我最接近的是:

$xml->xpath('/release/images/image[@type="primary"]')->attributes()->uri;

失败,因为您无法在attribute()之后调用xpath方法。

4 个答案:

答案 0 :(得分:2)

实现属性的纯XPath 1.0表达式是:

"/release/images/image[@type="primary"]/@uri" 

可能是你必须修复你的XPath。

答案 1 :(得分:2)

  

我想定位type="primary“的图像节点并返回   uri属性的值。

使用此XPath单行表达式

/*/images/image[@type="primary"]/@uri

这会选择uri元素名为image的属性,其type属性为"primary"的字符串值,并且是images的子元素} element`,它是XML文档中top元素的子元素。

要获取属性的值,请使用此XPath表达式

string(/*/images/image[@type="primary"]/@uri)

请注意:这是一个纯XPath解决方案,可以与任何符合W3C XPath标准的引擎一起使用。

答案 2 :(得分:0)

这个怎么样:

$xml = new SimpleXMLElement(file_get_contents('feed.xml'));
$theUriArray = $xml->xpath('/release/images/image[@type="primary"]');
$theUri = $theUriArray[0]->attributes()->uri;

echo($theUri);

答案 3 :(得分:0)

虽然我是内置DOMDocument的忠实粉丝而不是SimpleXML,因此并不熟悉SimpleXML ......

我相信$xml->xpath('/release/images/image[@type="primary"]')应该为您提供节点列表,而不是单个节点。

在您的情况下,我希望可能的解决方案就像

一样简单
$nodes = $xml->xpath('/release/images/image[@type="primary"]'); // get matching nodes
$node = reset($nodes); // get first item
$uri = $node->attributes()->uri;

由于您特别提到使用SimpleXML,我建议您尝试查看调用$xml->path(...)的结果 但是为了完整性,这就是我使用DOMDocument和DOMXPath(它将工作,保证,测试和所有)的方式:

$doc = new DOMDocument('1.0', 'utf8');
$doc->loadXML($yourXMLString);

$xpath = new DOMXPath($doc);
$nodes = $xpath->query('/release/images/image[@type="primary"]');

$theNodeYouWant = $nodes->item(0); // the first node matching the query
$uri = $theNodeYouWant->getAttribute('uri');

这似乎有点冗长,但这主要是因为我包含了这个的初始化。