Baigudin Software avatar
Baigudin Software logo
home
ru region
en region

PHP DOM Builder API 2.0

Выпущен релиз EOOS Automotive R23-03 в версия v0.11.0

Третий официальный релиз EOOS Automotive, который был тщательно проработан и квалифицирован для POSIX и WIN32 совместимых операционных систем с учетом интерфейсов разработанных для EOOS RT – операционной системы реального времени.

Выборка элементов DOM

Для выборки узлов документа используются следующие методы:

  • getElementsById;
  • getElementsByTagName;
  • getElementsByClassName;
  • getElementsByAttr;
  • getParentsById;
  • getParentsByTagName;
  • getParentsByClassName;
  • getParentsByAttr;

По каким критериям они производят поиск понятно из их названия. Методы с префиксом getElements ищут в дочерних узлах, а getParents - в родительских.

Для примера возьмём следующий документ:

<?php
use DomBuilder\Element as Element;
// Создаём корневой узел документа
$document Element::create();
// Создаём документ
$document->insert('html')
  ->
insert('head')
    ->
insert('title')->html('PHP DOM Builder test page')
    ->
after('meta')
    ->
attr('http-equiv''Content-Type')
    ->
attr('content''text/html; charset=utf-8')
    ->
parent()
  ->
after('body')
    ->
insert('div')->attr('id''content')
      ->
insert('h1')->html('Заголовок')
      ->
after('div')->addClass('article')->attr('id''id_article')
        ->
insert('h2')->html('Статья 1')
        ->
after('p')
          ->
insert('a')->href('google.com')->html('Текст 1')
          ->
parent()          
        ->
parent()
      ->
after('div')->addClass('article')->addClass('print')
        ->
insert('h2')
          ->
insert('a')->href('/article/')->html('Статья 2')
          ->
parent()
        ->
after('p')
          ->
insert('a')->href('baigudin.software')->html('Текст 2')
          ->
parent()
        ->
parent()        
      ->
parent()        
    ->
after('div')->attr('id''footer')
      ->
insert('p')->html('&copy; copyright 2016');
?>

Если вам всё еще тяжело представить HTML, получаемый после вывода, то вот он:

<!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" xml:lang="ru" lang="ru">
  <head>
    <title>PHP DOM Builder test page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
  </head>
  <body>
    <div id="content">
      <h1>
        Заголовок
      </h1>
      <div class="article" id="id_article">
        <h2>
          Статья 1
        </h2>
        <p>
          <a href="google.com">Текст 1</a>
        </p>
      </div>
      <div class="article print">
        <h2>
          <a href="/article/">Статья 2</a>
        </h2>
        <p>
          <a href="baigudin.software">Текст 2</a>
        </p>
      </div>
    </div>
    <div id="footer">
      <p>
        &copy; copyright 2016
      </p>
    </div>
  </body>
</html>

Теперь попробуем что-нибудь найти и изменить:

<?php
// Изменение заголовка H2 у статьи 1
$h2 $document->getElementsById('id_article')
  ->
child()->html('Новая статья 1');
// Удаление атрибутов ID у всех родительских DIV-ов
$h2->getParentsByTagName('div')->removeAttr('id');
// Поиск узлов со значением атрибута ID равного "content"
$len $document->getElementsByAttr('id''content')->length();
if(
$len == 0)
{
  
// Поиск и удаление узлов со значением класса "print"
  
$document->getElementsByClassName('print')->remove();
}

// Выводим документ
echo Element::getDocument($document);
?>

Для начала мы изменим заголовок H2 у статьи 1. Искать его будем по его идентификатору «id_article» с помощью метода getElementsById. Все методы выборки узлов возвращают ссылку на класс ElementList. Для получения класса самого узла мы вызываем метод get с параметром ноль, возвращающий первый узел списка. В результате мы получим тег DIV с идентификатором «id_article». Возьмём у него первый дочерний узел, что и будет искомый H2, и изменим его заголовок.

Здесь стоит отметить, что HTMLдокумент будет валиден, если идентификаторы его тегов уникальны. Но от всего не убережёшься, поэтому мы и ввели метод getElementsById. Если вы уверены в вашем документе, то можете использовать метод getElementById. Она возвращает класс ElementNode, если найдет ровно один узел, или false.

Теперь, относительно найденного тега H2, найдём все родительские теги DIV и удалим у них атрибут ID. Несложно понять, что в нашем документе не будет идентификаторов «id_article» и «content». Проверим это. Найдем в документе тег с идентификатором «content» и, если его не будет, удалим тег с классом «print». Результатбудетследующий:

<!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" xml:lang="ru" lang="ru">
  <head>
    <title>PHP DOM Builder test page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
  </head>
  <body>
    <div>
      <h1>
        Заголовок
      </h1>
      <div class="article">
        <h2>
          Новая статья 1
        </h2>
        <p>
          <a href="google.com">Текст 2</a>
        </p>
      </div>
    </div>
    <div id="footer">
      <p>
        &copy; copyright 2016
      </p>
    </div>
  </body>
</html>

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

К предыдущей статье

К списку статей

К следующей статье