Все в DOM является узлом.Не только элементы, но и текст тоже.Вы выбираете узлы элемента, но ваш результат выводит текстовые узлы отдельно.Поэтому вам нужно получить текстовые узлы DOM, которые не являются просто пробельными узлами.Это не сложно с выражением Xpath:
//text()[normalize-space(.) != ""]
//text()
извлекает любой текстовый узел в документе (включая разделы CDATA).normalize-space()
- это функция Xpath, которая сокращает группы пробелов внутри строки до отдельных пробелов.Начальные и конечные пробелы будут удалены.Поэтому [normalize-space(.) != ""]
удаляет все узлы из списка, которые содержат только пробелы.
Родительским узлом каждого текстового узла является его элемент.Соедините:
$document = new DOMDocument();
$document->loadXML($content);
$xpath = new DOMXpath($document);
$nodes = $xpath->evaluate('//text()[normalize-space(.) != ""]');
foreach ($nodes as $node) {
echo $node->parentNode->getNodePath(), "\n";
echo $node->textContent, "\n";
}
Вывод:
/p
Start of paragraph -
/p/strong/em
This note
/p
provides
/p/em
information
/p
about the contractual terms.