XPath и пространства имен

green-84

Новичок
XPath и пространства имен

С помощью скрипта в файле index.php:

PHP:
<?php
$doc = new DOMDocument('1.0', "Windows-1251");
$doc->formatOutput=true;
$doc->validateOnParse = true;
$doc->load("base.html");

$xpath = new DOMXPath($doc);
$entries = $xpath->query("/html/head/title");
foreach ($entries as $entry) {
  echo iconv("UTF-8", "Windows-1251", $entry->nodeValue);
}

$doc->save("test.html");
?>
я пытаюсь вывести содержимое нода title в файле base.htm:

PHP:
<?xml version="1.0" encoding="windows-1251" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=charset=Windows-1251" />
<title>Главная</title>
</head>
<body>
</body>
</html>
Но $entries = $xpath->query("/html/head/title"); ничего не находит из-за объявленного нэймспейса.

Подскажите как правильно свормировать строку запроса "/html/head/title". Может нужно зарегистрировать пространство имен (возможно, используя DOMXPath->registerNamespace()) для файла base.htm?
 

Гравицапа

elbirret elcno
PHP:
$entries = $xpath->query("//*[local-name()='title']");
?
P.S. Почему не работает твой вариант тоже будет интересно узнать.
 

green-84

Новичок
Автор оригинала: Гравицапа
PHP:
$entries = $xpath->query("//*[local-name()='title']");
?
P.S. Почему не работает твой вариант тоже будет интересно узнать.
Спасибо, мэн, - работает.
Мой вариант работает, если из base.htm убрать строчку

PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
Но, наверняка есть способы получше. Ведь мне, например, понадобиться из base.htm выдернуть скажем 3-й td из table. И это будет сделать проще и надежней с помощью абсолютной адресации /html/body/table/td[position()=2].

Можно, конечно, загружать base.htm с помощью DOMDocument->loadHTMLFile() - тогда $xpath->query("/html/head/title"); вернет то что нужно. Но при выводе документа функцией DOMDocument->saveHTMLFile() русские символы будут представлены в "жопном" виде...
 
Сверху