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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // $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!