Как запретить DOMXPath расширять HTML-объекты?

#php #xml #dom #xpath #html-entities

#php #xml #dom #xpath #html-объекты

Вопрос:

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

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

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

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

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

 [space]Test
  

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

 amp;nbsp;Test
  

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

У вас есть идея?

Комментарии:

1. [space] не является UTF-8. Вы уверены, что это U 0020, а не U 00A0?

2. @Alohci: Да, вы правы, это U 00A0. Я просто хотел прояснить, что выходные данные отображаются с пробелами вместо объекта nbsp.

3. @Dimitre: Извините, но это вопрос, специфичный для XPath. Речь идет о выводе запроса XPath.

4. Я не знаю, но с SimpleXML вы делаете $xml = html_entity_decode($ xml, ENT_NOQUOTES, ‘UTF-8’); ( php.net/manual/en/simplexmlelement.asxml.php#107137 )

Ответ №1:

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

Ответ №2:

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

Комментарии:

1. Я не думаю, что этот ответ правильный. Процессор XPath не работает с информационным набором, он работает с моделью данных XPath (XDM), которая определяется в терминах информационного набора. Информационный набор допускает наличие элементов справочной информации о нерасширенных объектах. XDM этого не делает. Так что это действительно проблема XPath.