#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.