It’s odd. I don’t think about think about XPath from one month to the next. But once in a while, when my usual solutions have all come up blank. Ta-Da XPath to the rescue!
Recently as part of a site I was working on, the design basically required that I inject a block of content into a nested list (part of an elaborate menu actually) – bit of a fiddle because modifying the code that generated the list was not an option.
My first avenues of attack were just simple str_replace() and a regex replace, but I just couldn’t get it work consistently – there were two many variables – additional attributes, white-space etc. The two constants were that the code fragment validated as xhtml (hence xml) and I would always have a class that I could use as a hook.
// $menu - fragment of html consisting of nested UL's
$xml = simplexml_load_string($menu);
$nodes = $xml->xpath('//*[@class = "current"]');
if(!empty($nodes)){
$nodes[0]->addChild('div', 'text_to_replace');
$menu = $xml->asXML();
echo str_replace('text_to_replace', $str, $menu);
} else {
echo $menu;
}
//*[@class = "current"]
finds nodes at any level with where the class attribute contains ‘current’.
node[0]
is the first instance of a node with this attribute and inject some place-holder text.
$menu = $xml->asXML();
our modified list.
Hey presto!