XPath / Domdocument verifique o nome da criança por class

Estou tentando encontrar nodos filho por um determinado nome de class (divs com nome de class = ‘foo’) dentro de um loop de nós DOMDocument. Se existir, ele deve definir o meu valor foo como 1:

O meu documento HTML $ parece:

... 
Div Posts 1
Div Posts 2
Div Posts 3
Div Posts 4
Div Posts 5
...

DOMDocument / Xpath ($ document):

 $html = array(); $document = new \DOMDocument(); $document->loadHTMLFile($url); // loads html from above $xpath = new \DOMXPath($document); $i=0; foreach ($xpath->query(Parser::cssToXpath('.posts')) as $node) { $html['posts'][$i]['content'] = $node->nodeValue; // check if child node with class name 'foo' exists => doesn't work :( $children = $node->getElementsByTagName('foo'); if($children) $html['posts'][$i]['foo'] = '1'; else $html['posts'][$i]['foo'] = '0'; $i++; } 

Saída:

 [posts] => Array ( [0] => Array ( [content] => Div class Posts 1 [foo] => 1 ) [1] => Array ( [content] => Div class Posts 2 [foo] => 1 ) [2] => Array ( [content] => Div class Posts 3 [foo] => 1 ) [3] => Array ( [content] => Div class Posts 4 [foo] => 1 ) [4] => Array ( [content] => Div class Posts 5 [foo] => 1 ) ) 

getElementsByTagName () pode não ser o método certo para isso, mas tentei methods diferentes e não encontrei o caminho certo. 🙁

De acordo com o seu comentário

Hm sim, mas ainda não funciona infelizmente. Eventualmente, eu preciso saber quais .posts div tem o elemento filho ‘foo’ porque eu preciso analisar o conteúdo desse pai e também preciso substituí-lo mais tarde

Para a resposta anterior, o seu predicado é provavelmente:

a) selecione elementos div
b) com class de atributo = posts
c) e com um elemento filho div
d) que tem class de atributo = foo

como expressão xpath:

a) // div
b) // div [@ class = “posts”]
c) // div [@ class = “posts” e div]
d) // div [@ class = “posts” e div [@ class = “foo”]]

por exemplo

 loadhtml( getData() ); $xpath = new DOMXPath($doc); /* use something like //div[contains(concat(' ',normalize-space(@class),' '),' post ')] if the html element may have class="post lalala" */ foreach( $xpath->query('//div[@class="posts" and div[@class="foo"]]') as $post) { while ( $post->firstChild ) { $post->removeChild( $post->firstChild ); } $post->appendChild( $doc->createElement('span', 'The quick fox....') ); } echo $doc->savehtml(); function getData() { return <<< eoh ... 
Div Posts 1
Div Posts 2
Div Posts 3
Div Posts 4
Div Posts 5
eoh; }

imprime

  ... 
Div Posts 1
The quick fox....
Div Posts 3
The quick fox....
Div Posts 5

Use este XPath para encontrar todos os elementos div com class foo

 //div[@class = 'foo'] 

Para ser mais específico, use isso:

 //div[@class = 'posts']/div[@class = 'foo']