我一直在回顾所有旧代码并尝试优化它。我最近偶然发现的事情让我感到困惑的是试图为此找到一个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());
}
答案 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']