Intereting Posts
Примечание. Неопределенная переменная: _SESSION в строке "" в строке 9 Добавление элементов в массив в массиве с php? проверьте, содержит ли строка (CR, LF или CF или LF) или не использует PHP 1970-01-01 вставляется в базу данных, когда не выбрана дата Ошибка получения идентификатора пользователя из веб-браузера Messenger даже после белого домена CodeIditor base url не recongnized в javascript Как остановить конфликтующие две библиотеки jquery друг с другом? PHP flock () – что находится под капотом? список всех изображений в каталоге в JSON Какова история с переменной $ variable-> в PHP? Лучший способ избежать дублирования ввода в базу данных mysql WordPress, как установить длину выдержки сообщения до 100 символов и 200 символов Эвакуация с использованием косой черты, а затем использование stripslashes PHP Борьба за установку названий страниц для динамических страниц PHP на сайте WordPress Заполнить список раскрывающихся списков в зависимости от другого варианта выпадающего списка, используя Ajax

Базовый DOMXpath, может быть неправильным? (re: проверить пространство имен ввода всегда)

Я использую внутренний domDocument в классе $this->doc->dom , и я думаю, что это нормально, потому что $this->doc->dom->saveXML() работает и показывает мой XML, что-то вроде

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>04</title> <link href="css/04.css" rel="stylesheet" type="text/css"/> </head> ... 

И когда я использую

  $xpath = new DOMXpath($this->doc->dom); $elements = $xpath->query('//link'); 

не сообщалось об ошибке … Но нет элементов (!),

  print $elements->length; 

показать 0 (ноль). В этом и проблема , и для меня это СУБД DomDocument: элемент <link ../> есть!


Изменить, чтобы добавить дополнительные подсказки …

Когда я делаю подобное с getElementsByTagName() он работает (!), Поэтому, это не проблема с $this->doc->dom .

  $test = $this->doc->dom->getElementsByTagName('link'); print $test->length; // OK, not zero, returns 1! 

Solutions Collecting From Web of "Базовый DOMXpath, может быть неправильным? (re: проверить пространство имен ввода всегда)"

Это не ошибка «DomDocument».

Простые решения

Консолидация опубликованных комментариев.

Зарегистрировать пространство имен

(Ответ @PaulT) Корень (тег html ) имеет объявленное пространство имен, xmlns="http://www.w3.org/1999/xhtml" . С registerNamespace() вы можете зарегистрировать его с произвольным псевдонимом (xx), затем выполнить правильный запрос

 $xpath->registerNamespace('xx', "http://www.w3.org/1999/xhtml"); $xpath->query('//xx:link'); 

Удалить атрибут пространства имен из root

Я фильтрую свой вход, поэтому он изменился на

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>04</title> <link href="css/04.css" rel="stylesheet" type="text/css"/> </head> ... </html> 

теперь работает так, как я ожидал, без необходимости «проклятых пространств имен».

Отладка XPath

(@RolandoIsidoro ответ) В случае проблем в подобных случаях попробуйте инструмент, например freeformatter.com/xpath-tester.html . В вашем примере это приводит к ошибке, которая привела бы вас к решению:

По умолчанию (без префикса) URI пространства имен для запросов XPath всегда '', и его нельзя переопределить на ' http://www.w3.org/1999/xhtml '