Как я могу достичь этого:
<root> <gallery name="First"> <picture active="1" detail="not shown"/> <picture active="1" detail="not shown"/> <picture active="0" detail="not shown"/> </gallery> <gallery name="Second"> <picture active="0" detail="not shown"/> <picture active="1" detail="SHOW THIS ONE"/> <picture active="1" detail="AND SHOW THIS ONE" /> </gallery> </root>
Я пытаюсь:
$myArray = $objXML->xpath('gallery[@name="Second"]/picture[@active=1]');
Как я могу изменить его, чтобы получить желаемый результат? Спасибо, Энди
Ваш XPath ошибочен. Либо используйте
/root/gallery[@name="Second"]/picture[@active=1]
для сопоставления этой совокупности узлов только с корневым узлом или
//gallery[@name="Second"]/picture[@active=1]
для сопоставления этой совокупности узлов в любом месте документа (медленнее)
Полные рабочие примеры:
$dom = new DOMDocument; $dom->load('NewFile.xml'); // containing your XML $xp = new DOMXPath($dom); $pictures = $xp->query('/root/gallery[@name="Second"]/picture[@active=1]'); foreach ($pictures as $picture) { echo $dom->saveXml($picture), PHP_EOL; }
дает
<picture active="1" detail="SHOW THIS ONE"/> <picture active="1" detail="AND SHOW THIS ONE"/>
а также
$sxe = new SimpleXMLElement('NewFile.xml', NULL, TRUE); $pictures = $sxe->xpath('/root/gallery[@name="Second"]/picture[@active=1]'); foreach ($pictures as $picture) { echo $picture['detail'], PHP_EOL; }
дает
SHOW THIS ONE AND SHOW THIS ONE