Сегодня покажу вам, ребята, немного "костыликов" при работе с xml и xpath.
Допустим, откуда-то издалека вы получаете кусок html-разметки и дальше ее парсите, вытягивая заголовки, какие-нибудь абзацы текстов и прочие слова. Как только вы все полученные данные захотите вывести - может произойти так что на странице вместо текста будут всем известные кракозябры. В чем же дело? А дело в том, что при создании объекта
Само собой это надо быстренько исправить. И написать вот так:
Причем абсолютно неважно как выглядит строка с html-разметкой - один ли там корневой элемент или несколько,
Еще один костылик при работе с DOM-парсером xml - это собственная обработка ошибок, возникающих при парсинге. Для этого используются следующие функции, например так:
Допустим, откуда-то издалека вы получаете кусок html-разметки и дальше ее парсите, вытягивая заголовки, какие-нибудь абзацы текстов и прочие слова. Как только вы все полученные данные захотите вывести - может произойти так что на странице вместо текста будут всем известные кракозябры. В чем же дело? А дело в том, что при создании объекта
DOMDocument
вы не указали кодировку, в которой пришли данные. Ну и так как вы это не указали, то DOMDocument
подумал, что данные пришли скорее всего в ISO-8859-1
.Само собой это надо быстренько исправить. И написать вот так:
// Создаем объект
$dom = new DOMDocument('1.0', 'utf-8');
// Ваша строка с HTML-разметкой
$stringToParse = "......";
// Загружаем строку в DOMDocument, ЯВНО указывая ее кодировку
$dom->loadHTML('<?xml encoding="utf-8"?>' . $stringToParse);
// Делаем xpath-запрос, например
$xpath = new DOMXPath($dom);
$ps = $xpath->query('//p');
Причем абсолютно неважно как выглядит строка с html-разметкой - один ли там корневой элемент или несколько,
DOMDocument
сделает все как надо.Еще один костылик при работе с DOM-парсером xml - это собственная обработка ошибок, возникающих при парсинге. Для этого используются следующие функции, например так:
// Передачей параметра true мы включаем обработку ошибок пользователем
libxml_use_internal_errors(true);
// Создаем новый объект
$doc = new DOMDocument;
// Пытаемся загрузить какой-то xml
if (!$doc->load('file.xml')) {
// Если есть желание - можно оповестить пользователя об ошибках
foreach (libxml_get_errors() as $error) {
print_r($error);
}
// А если желания нет - то и не надо
// Просто очищаем текущие собранные ошибки и живем дальше
libxml_clear_errors();
}
Комментариев нет:
Отправить комментарий