我一直在回顾所有旧代码并尝试优化它。这是我最近偶然发现,并且已经得到了我难倒正试图找到这一个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字符串。
这甚至可能吗?还是比我已经有的更好/更快/更高效?建议/解决方案?
编辑:对于我的XML的Tandu的解决方案
示例文件
<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());
}
去过使用SimpleXML了这么久我忘了他的哥哥DOM! – mseancole
*没有意识到输入会添加注释而不是移动到下一行XD 我的XML当然是simplexml。这是我得到的,不知道如果最优雅的方式,但我仍然无法得到它的工作:( 原来的帖子中添加的代码,因为我无法正确格式化在这里:( – mseancole
@showerhead我可以看到你的xml?请注意,“root”和“child”是节点名称。例如,如果你有' ',你可以在我的例子中将“root”替换为“father”和“child”替换为“son”。我看你在问题的例子中仍然使用“孩子”。 –