Как предотвратить расширение объектов HTML в DOMXPath?


Я использую DOMDocument и DOMXPath в PHP для поиска элементов в HTML-документе. Этот документ содержит HTML-объекты, такие как  , и я хотел бы, чтобы эти объекты были сохранены в выводе XPath.

$doc = new DOMDocument();
$doc->loadHTML('<html><head></head><body>&nbsp;Test</body></html>');

$xpath = new DOMXPath($doc);
$nodes = $xpath->query('//body');

foreach($nodes as $node) {
    echo $node->textContent;
}

Этот код выдает следующий вывод (UTF-8):

[space]Test

Но я хотел бы иметь это:

&nbsp;Test

Возможно, это как-то связано с LibXML, который PHP использует внутри, но я не смог найти ни одной функции, которая сохраняла бы сущности HTML.

Делать у тебя есть идея?

Author: Dimitre Novatchev, 2011-05-15

2 answers

XPath всегда видит представление XML-документа, в котором были расширены ссылки на сущности. Единственный способ предотвратить это - предварительно обработать XML-документ, заменив ссылки на сущности чем-то, что не будет расширено, например, изменив &nbsp; на §nbsp;.

 4
Author: Michael Kay, 2011-05-15 22:21:30

Процессор XPath не знает, был ли указан символ пробела без торможения как &nbsp; или как &#xA0;' -- the character is always provided to it as a character entity -- `.

 2
Author: Dimitre Novatchev, 2011-05-15 23:26:59