Получить HTML-теги по пространству имен в PHP XPath Query - PullRequest
0 голосов
/ 05 апреля 2011

Допустим, у меня есть следующий фрагмент HTML:

<div abc:section="section1">
  <p>Content...</p>
</div>
<div abc:section="section2">
  <p>Another section</p>
</div>

Как я могу получить DOMNodeList (в PHP) с DOMNode для каждого из <div> с установленным атрибутом abc:section.

В настоящее время у меня есть следующий код

$dom = new DOMDocument();
$dom->loadHTML($html)

$xpath = new DOMXPath($dom);
$xpath->registerNamespace('abc', 'http://xml.example.com/AbcDocument');

Следующие XPath не будут работать:

$xpath->query('//@abc:section');
$xpath->query('//*[@abc:section]');

Загруженный HTML-код всегда является фрагментом кода, я преобразую его с помощью функций DOMDocument и передаю его в шаблон.

1 Ответ

1 голос
/ 05 апреля 2011

Метод loadHTML вызовет модуль HTML-анализатора из libxml . Afaik, итоговое дерево HTML не будет содержать пространств имен, поэтому запрос к ним с помощью XPath здесь не сработает. Вы можете сделать

$dom = new DOMDocument();
$dom->loadHtml($html);
$xpath = new DOMXPath($dom);
foreach ($dom->getElementsByTagName('div') as $node) {
    echo $node->getAttribute('abc:section');
}
echo $dom->saveHTML();

В качестве альтернативы вы можете использовать //div/@* для извлечения всех атрибутов, включая атрибуты пространства имен. Однако в запросе не должно быть двоеточия, поскольку для этого требуется регистрация префикса пространства имен, но, как указано выше, это не работает для дерева HTML.

Еще одна альтернатива - использовать //@*[starts-with(name(), "abc:section")].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...