根据属性查找特定元素

时间:2011-10-27 01:47:53

标签: php xml xpath

我一直在回顾所有旧代码并尝试优化它。我最近偶然发现的事情让我感到困惑的是试图为此找到一个xpath解决方案:

function findit($search) {
    $i=0;
    foreach($xml as $page) { //loop to find specific $element based on $attribute
       if($page['src']==$search) { return $i; }
       $i++;
    }
}

需要返回$i,以便以后可以用它来引用XML中的元素。

似乎它应该是可能的,我发现了一些似乎应该工作的xpath字符串,但却没有。它们通常引用preceding-children并通过xpath()函数对它们进行计数,但我找不到原始资源,也不知道如何将其转换为PHP xpath字符串。

这甚至可能吗?或者它比我已经获得的更好/更快/更有效率?建议/解决方案?

编辑:对于Tandu的解决方案

我的XML文件示例

<range>
    <page src="attribute1" />
    <page src="attribute2" />
    etc...
    <page src="attribut20" />
</range>

在我目前的PHP函数中,$i始终返回0,但应该返回找到的$search位置。编辑,因此不再需要转换simplexml。

function findit($search) {
    $dom=new DOMDocument('1.0');
    $dom->load($file);
    $xpath=new DOMXPath($dom);
    $i=$xpath->evaluate("count(/range/page[@src='$search']/preceding-sibling::*)");
    die($dom->saveXML());
}

2 个答案:

答案 0 :(得分:3)

PHP至少有两个(我知道的)处理Xpath的方法:DOMXPath库,它与DOMDocument一起使用,SimpleXML,它有自己的{{1} }} 方法。如果要评估实际表达式(例如在示例中获取 i ),则必须使用xpath()DOMXPath::evaluate()只返回一个节点列表(SimpleXML::xpath()也是如此。在php中也有DOMXPath::query()个方法,但这些方法似乎是其他方法的功能版本,仍然需要DOM上下文节点对象

我不确定上面示例中的xpath_是什么,但下面的示例使用DOMXPath。据我所知,没有简单的方法可以将xml转换为SimpleXML。你只需要单独加载xml。

DOMDocument

答案 1 :(得分:0)

使用单个XPath表达式,因此您无需迭代结果

elementWithSomeName[@attribute = 'someNeededValue']

或(如果“属性是元素的名称):

elementWithSomeName[attribute = 'someNeededValue']