Почему не отображается атрибут html через php xpath
<?php
$content = '<div class="keep-me">Keep this div</div><div class="remove-me" id="test">Remove this div</div>';
$badClasses = array('');
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($content);
libxml_clear_errors();
$xPath = new DOMXpath($dom);
foreach($badClasses as $badClass){
$domNodeList = $xPath->query('//div[@class="remove-me"]/@id');
$domElemsToRemove = ''; // container of deleted elements
foreach ( $domNodeList as $domElement ) {
$domElemsToRemove .= $dom->saveHTML($domElement); // concat them
$domElement->parentNode->removeChild($domElement); // then remove
}
}
$content = $dom->saveHTML();
echo htmlentities($domElemsToRemove);
?>
Работает — // div [@ class = «remove-me»] или // div [@ class = «remove-me»] / text ()
Не работает — // div [@ class = «remove-me»] / @ id
Может быть, есть способ проще
XPath //div[@class="remove-me"]/@id
правильно, но вам нужно просто зациклить возвращенные элементы и добавить nodeValue
к списку совпадающих идентификаторов …
$xPath = new DOMXpath($dom);
$domNodeList = $xPath->query('//div[@class="remove-me"]/@id');
$ids = []; // container of deleted elements
foreach ( $domNodeList as $domElement ) {
$ids[] = $domElement->nodeValue;
}
print_r($ids);
Если целью является получение идентификатора любого элемента с классом "remove-me"
как это, как я интерпретирую вопрос, то, возможно, вы можете попробовать, как это — непроверенный кстати …
…. другой код перед
$xp=new DOMXpath( $dom );
$col= $xp->query( '*[@class="remove-me"]' );
if( $col->length > 0 ){
foreach($col as $node){
$id=$node->hasAttribute('id') ? $node->getAttribute('id') : 'banana';
echo $id;
}
}
однако рассмотрение кода в вопросе предполагает, что вы хотите удалить узлы — в этом случае создать массив узлов (список узлов) и выполнить итерацию по нему от конца к началу — то есть: назад …