Wracam do poprzedniego kodu i staram się go zoptymalizować. Coś mi niedawno natknął i że ma zdobyć mnie zakłopotany próbuje znaleźć rozwiązanie dla tego xpath:Znajdź określony element oparty na atrybucie
function findit($search) {
$i=0;
foreach($xml as $page) { //loop to find specific $element based on $attribute
if($page['src']==$search) { return $i; }
$i++;
}
}
Musi powrócić $i
tak, że może on być stosowany jako odniesienie do elementu w pliku XML później.
Wygląda na to, że powinno być możliwe, i znalazłem kilka łańcuchów xpath, które wyglądają tak, jakby powinny działać, ale nie. Zwykle odnoszą się do preceding-children
i liczą je poprzez funkcję xpath()
, ale nie mogę już znaleźć oryginalnych źródeł i nie tłumaczę tego na ciąg PHP xpath.
Czy to możliwe? Czy jest to lepsze/szybsze/wydajniejsze niż to, co już mam? Sugestie/rozwiązania?
EDIT: Dla Tandu za rozwiązanie
przykładzie mojego pliku XML
<range>
<page src="attribute1" />
<page src="attribute2" />
etc...
<page src="attribut20" />
</range>
W mojej obecnej funkcji PHP, $i
zawsze zwraca 0
ale powinien wrócić cokolwiek pozycja $search
znajduje się przy ul. Edytowane, więc nie trzeba już konwertować 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());
}
używa SimpleXML tak długo zapomniałem o jego starszy brat DOM! – mseancole
* Nie zrealizowałem enter, aby dodać komentarz zamiast przejść do następnej linii XD Mój XML to oczywiście simplexml. To jest to, co mam, nie jestem pewien, czy jest to najbardziej elegancki sposób, ale nadal nie mogę go uruchomić :( Dodany kod w oryginalnym wpisie, ponieważ nie mogłem go poprawnie sformatować :( – mseancole
@showerhead can I zobacz swój xml? Zauważ, że "root" i "child" są nazwami węzłów.Na przykład, jeśli masz ' ' zamiast tego, w moim przykładzie zamienić "root" na "ojciec" i "dziecko" na "syn". Widzę, że nadal używasz słowa "dziecko" w przykładzie w pytaniu. –