Я использую внутренний 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!
Это не ошибка «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');
Я фильтрую свой вход, поэтому он изменился на
<?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>
теперь работает так, как я ожидал, без необходимости «проклятых пространств имен».
(@RolandoIsidoro ответ) В случае проблем в подобных случаях попробуйте инструмент, например freeformatter.com/xpath-tester.html . В вашем примере это приводит к ошибке, которая привела бы вас к решению:
По умолчанию (без префикса) URI пространства имен для запросов XPath всегда '', и его нельзя переопределить на ' http://www.w3.org/1999/xhtml '