{"id":13622446,"url":"https://github.com/Imangazaliev/DiDOM","last_synced_at":"2025-04-15T06:30:32.718Z","repository":{"id":36465075,"uuid":"40770322","full_name":"Imangazaliev/DiDOM","owner":"Imangazaliev","description":"Simple and fast HTML and XML parser","archived":false,"fork":false,"pushed_at":"2024-03-15T06:37:48.000Z","size":468,"stargazers_count":2206,"open_issues_count":23,"forks_count":202,"subscribers_count":86,"default_branch":"master","last_synced_at":"2025-04-10T11:01:41.242Z","etag":null,"topics":["dom","html","html-parser","parser","xml","xml-parser","xpath"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Imangazaliev.png","metadata":{"files":{"readme":"README-RU.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-08-15T16:18:34.000Z","updated_at":"2025-04-08T11:02:14.000Z","dependencies_parsed_at":"2022-07-07T03:32:01.572Z","dependency_job_id":"540d637d-0ca6-4173-9536-4eea054b8bbd","html_url":"https://github.com/Imangazaliev/DiDOM","commit_stats":{"total_commits":291,"total_committers":14,"mean_commits":"20.785714285714285","dds":"0.15463917525773196","last_synced_commit":"50fa6595d14f22c0c984efed5c818485cf548136"},"previous_names":[],"tags_count":61,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Imangazaliev%2FDiDOM","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Imangazaliev%2FDiDOM/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Imangazaliev%2FDiDOM/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Imangazaliev%2FDiDOM/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Imangazaliev","download_url":"https://codeload.github.com/Imangazaliev/DiDOM/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248602275,"owners_count":21131613,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dom","html","html-parser","parser","xml","xml-parser","xpath"],"created_at":"2024-08-01T21:01:19.363Z","updated_at":"2025-04-15T06:30:32.710Z","avatar_url":"https://github.com/Imangazaliev.png","language":"PHP","funding_links":[],"categories":["Table of Contents","PHP","\u003e 1k ★","目录","📌 Covered Topics","Core Libraries"],"sub_categories":["Scraping","爬虫 Scraping","PHP","Library"],"readme":"# DiDOM\n\n[![Build Status](https://travis-ci.org/Imangazaliev/DiDOM.svg?branch=master)](https://travis-ci.org/Imangazaliev/DiDOM)\n[![Total Downloads](https://poser.pugx.org/imangazaliev/didom/downloads)](https://packagist.org/packages/imangazaliev/didom)\n[![Latest Stable Version](https://poser.pugx.org/imangazaliev/didom/v/stable)](https://packagist.org/packages/imangazaliev/didom)\n[![License](https://poser.pugx.org/imangazaliev/didom/license)](https://packagist.org/packages/imangazaliev/didom)\n\nDiDOM - простая и быстрая библиотека для парсинга HTML.\n\n- [English version](README.md)\n- [Документация для версии 1.x](https://github.com/Imangazaliev/DiDOM/blob/98d411741d598b0b74bb38e215d99c1cdb0d532d/README-RU.md). Чтобы обновится с версии 1.x, пожалуйста просмотрите [историю изменений](CHANGELOG.md).\n\n## Содержание\n\n- [Установка](#Установка)\n- [Быстрый старт](#Быстрый-старт)\n- [Создание нового документа](#Создание-нового-документа)\n- [Поиск элементов](#Поиск-элементов)\n- [Проверка наличия элемента](#Проверка-наличия-элемента)\n- [Подсчет количества элементов](#Подсчет-количества-элементов)\n- [Поиск в элементе](#Поиск-в-элементе)\n- [Поддерживамые селекторы](#Поддерживамые-селекторы)\n- [Изменение содержимого](#Изменение-содержимого)\n- [Вывод содержимого](#Вывод-содержимого)\n- [Работа с элементами](#Работа-с-элементами)\n    - [Создание нового элемента](#Создание-нового-элемента)\n    - [Получение названия элемента](#Получение-названия-элемента)\n    - [Получение родительского элемента](#Получение-родительского-элемента)\n    - [Получение соседних элементов](#Получение-соседних-элементов)\n    - [Получение дочерних элементов](#Получение-соседних-элементов)\n    - [Получение документа](#Получение-документа)\n    - [Работа с атрибутами элемента](#Работа-с-атрибутами-элемента)\n    - [Сравнение элементов](#Сравнение-элементов)\n    - [Добавление дочерних элементов](#Добавление-дочерних-элементов)\n    - [Замена элемента](#Замена-элемента)\n    - [Удаление элемента](#Удаление-элемента)\n- [Работа с кэшем](#Работа-с-кэшем)\n- [Прочее](#Прочее)\n- [Сравнение с другими парсерами](#Сравнение-с-другими-парсерами)\n\n## Установка\n\nДля установки DiDOM выполните команду:\n\n    composer require imangazaliev/didom\n\n## Быстрый старт\n\n```php\nuse DiDom\\Document;\n\n$document = new Document('http://www.news.com/', true);\n\n$posts = $document-\u003efind('.post');\n\nforeach($posts as $post) {\n    echo $post-\u003etext(), \"\\n\";\n}\n```\n\n## Создание нового документа\n\nDiDom позволяет загрузить HTML несколькими способами:\n\n##### Через конструктор\n\n```php\n// в первом параметре передается строка с HTML\n$document = new Document($html);\n\n// путь к файлу\n$document = new Document('page.html', true);\n\n// или URL\n$document = new Document('http://www.example.com/', true);\n\n// также можно создать документ из DOMDocument\n$domDocument = new DOMDocument();\n$document = new Document($domDocument);\n```\n\nСигнатура:\n\n```php\n__construct($string = null, $isFile = false, $encoding = 'UTF-8', $type = Document::TYPE_HTML)\n```\n\n`$isFile` - указывает, что загружается файл. По умолчанию - `false`.\n\n`$encoding` - кодировка документа. По умолчанию - UTF-8.\n\n`$type` - тип документа (HTML - `Document::TYPE_HTML`, XML - `Document::TYPE_XML`). По умолчанию - `Document::TYPE_HTML`.\n\n##### Через отдельные методы\n\n```php\n$document = new Document();\n\n$document-\u003eloadHtml($html);\n\n$document-\u003eloadHtmlFile('page.html');\n\n$document-\u003eloadHtmlFile('http://www.example.com/');\n```\n\nДля загрузки XML есть соответствующие методы `loadXml` и `loadXmlFile`.\n\nПри загрузке документа через эти методы, парсеру можно передать дополнительные [опции](http://php.net/manual/ru/libxml.constants.php):\n\n```php\n$document-\u003eloadHtml($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);\n$document-\u003eloadHtmlFile($url, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);\n\n$document-\u003eloadXml($xml, LIBXML_PARSEHUGE);\n$document-\u003eloadXmlFile($url, LIBXML_PARSEHUGE);\n```\n\n## Поиск элементов\n\nВ качестве выражения для поиска можно передать CSS-селектор или XPath. Для этого в первом параметре нужно передать само выражение, а во втором - его тип (по умолчанию - `Query::TYPE_CSS`):\n\n##### Через метод `find()`:\n\n```php\nuse DiDom\\Document;\nuse DiDom\\Query;\n\n...\n\n// CSS-селектор\n$posts = $document-\u003efind('.post');\n\n// эквивалентно\n$posts = $document-\u003efind('.post', Query::TYPE_CSS);\n\n// XPath-выражение\n$posts = $document-\u003efind(\"//div[contains(@class, 'post')]\", Query::TYPE_XPATH);\n```\n\nМетод вернет массив с элементами (экземпляры класса `DiDom\\Element`) или пустой массив, если не найден ни один элемент, соответствующий выражению.\n\nПри желании можно получить массив узлов без преобразования в Element или текст (`DOMElement`/`DOMText`/`DOMComment`/`DOMAttr`, в зависимости от выражения), для этого необходимо передать в качестве третьего параметра `false`.\n\n##### Через метод `first()`:\n\nВозвращает первый найденный элемент или `null`, если не найдено ни одного элемента.\n\nПринимает те же параметры, что и метод `find()`.\n\n##### Через магический метод `__invoke()`:\n\n```php\n$posts = $document('.post');\n```\n\nПринимает те же параметры, что и метод `find()`.\n\n**Внимание:** использование данного метода нежелательно, т.к. в будущем он может быть удален.\n\n##### Через метод `xpath()`:\n\n```php\n$posts = $document-\u003expath(\"//*[contains(concat(' ', normalize-space(@class), ' '), ' post ')]\");\n```\n\n## Проверка наличия элемента\n\nПроверить наличие элемента можно с помощью метода `has()`:\n\n```php\nif ($document-\u003ehas('.post')) {\n    // код\n}\n```\n\nЕсли нужно проверить наличие элемента, а затем получить его, то можно сделать так:\n\n```php\nif ($document-\u003ehas('.post')) {\n    $elements = $document-\u003efind('.post');\n\n    // код\n}\n```\n\nно быстрее так:\n\n```php\n$elements = $document-\u003efind('.post');\n\nif (count($elements) \u003e 0) {\n    // код\n}\n```\n\nт.к. в первом случае выполняется два запроса.\n\n## Подсчет количества элементов\n\nМетод `count()` позволяет подсчитать количество дочерних элементов, соотвествующих селектору:\n\n```php\n// выведет количество ссылок в документе\necho $document-\u003ecount('a');\n```\n\n```php\n// выведет количество пунктов в списке\necho $document-\u003efirst('ul')-\u003ecount('\u003e li');\n```\n\n## Поиск в элементе\n\nМетоды `find()`, `first()`, `xpath()`, `has()`, `count()` доступны также и для элемента.\n\nПример:\n\n```php\necho $document-\u003efind('nav')[0]-\u003efirst('ul.menu')-\u003expath('//li')[0]-\u003etext();\n```\n\n#### Метод `findInDocument()`\n\nПри изменении, замене или удалении элемента, найденного в другом элементе, документ не будет изменен. Данное поведение связано с тем, что в методе `find()` класса `Element` (а, соответственно, и в методах `first()` и `xpath`) создается новый документ, в котором и производится поиск.\n\nДля поиска элементов в исходном документе необходимо использовать методы `findInDocument()` и `firstInDocument()`:\n\n```php\n// ничего не выйдет\n$document-\u003efirst('head')-\u003efirst('title')-\u003eremove();\n\n// а вот так да\n$document-\u003efirst('head')-\u003efirstInDocument('title')-\u003eremove();\n```\n\n**Внимание:** методы `findInDocument()` и `firstInDocument()` работают только для элементов, которые принадлежат какому-либо документу, либо созданых через `new Element(...)`. Если элемент не принадлежит к какому-либо документу, будет выброшено исключение `LogicException`;\n\n## Поддерживамые селекторы\n\nDiDom поддерживает поиск по:\n\n- тэгу\n- классу, идентификатору, имени и значению атрибута\n- псевдоклассам:\n    - first-, last-, nth-child\n    - empty и not-empty\n    - contains\n    - has\n\n```php\n// все ссылки\n$document-\u003efind('a');\n\n// любой элемент с id = \"foo\" и классом \"bar\"\n$document-\u003efind('#foo.bar');\n\n// любой элемент, у которого есть атрибут \"name\"\n$document-\u003efind('[name]');\n\n// эквивалентно\n$document-\u003efind('*[name]');\n\n// поле ввода с именем \"foo\"\n$document-\u003efind('input[name=foo]');\n$document-\u003efind('input[name=\\'foo\\']');\n$document-\u003efind('input[name=\"foo\"]');\n\n// поле ввода с именем \"foo\" и значением \"bar\"\n$document-\u003efind('input[name=\"foo\"][value=\"bar\"]');\n\n// поле ввода, название которого НЕ равно \"foo\"\n$document-\u003efind('input[name!=\"foo\"]');\n\n// любой элемент, у которого есть атрибут,\n// начинающийся с \"data-\" и равный \"foo\"\n$document-\u003efind('*[^data-=foo]');\n\n// все ссылки, у которых адрес начинается с https\n$document-\u003efind('a[href^=https]');\n\n// все изображения с расширением png\n$document-\u003efind('img[src$=png]');\n\n// все ссылки, содержащие в своем адресе строку \"example.com\"\n$document-\u003efind('a[href*=example.com]');\n\n// все ссылки, содержащие в атрибуте data-foo значение bar отделенное пробелом\n$document-\u003efind('a[data-foo~=bar]');\n\n// текст всех ссылок с классом \"foo\" (массив строк)\n$document-\u003efind('a.foo::text');\n\n// эквивалентно\n$document-\u003efind('a.foo::text()');\n\n// адрес и текст подсказки всех полей с классом \"bar\"\n$document-\u003efind('a.bar::attr(href|title)');\n\n// все ссылки, которые являются прямыми потомками текущего элемента\n$element-\u003efind('\u003e a');\n```\n\n## Изменение содержимого\n\n### Изменение HTML\n\n```php\n$element-\u003esetInnerHtml('\u003ca href=\"#\"\u003eFoo\u003c/a\u003e');\n```\n\n### Изменение XML\n\n```php\n$element-\u003esetInnerXml(' Foo \u003cspan\u003eBar\u003c/span\u003e\u003c!-- Baz --\u003e\u003c![CDATA[\n    \u003croot\u003eHello world!\u003c/root\u003e\n]]\u003e');\n```\n\n### Изменение значения (как простой текст)\n\n```php\n$element-\u003esetValue('Foo');\n// будет закодирован в HTML-сущность как при вызове htmlentities()\n$element-\u003esetValue('\u003ca href=\"#\"\u003eFoo\u003c/a\u003e');\n```\n\n## Вывод содержимого\n\n### Получение HTML\n\n##### Через метод `html()`:\n\n```php\n// HTML-код документа\necho $document-\u003ehtml();\n\n// HTML-код элемента\necho $document-\u003efirst('.post')-\u003ehtml();\n```\n\n##### Приведение к строке:\n\n```php\n// HTML-код документа\n$html = (string) $document;\n\n// HTML-код элемента\n$html = (string) $document-\u003efirst('.post');\n```\n\n**Внимание:** использование данного способа нежелательно, т.к. в будущем он может быть удален.\n\n##### Форматирование HTML при выводе\n\n```php\necho $document-\u003eformat()-\u003ehtml();\n```\n\nМетод `format()` отсутствует у элемента, поэтому, если нужно получить отформатированный HTML-код элемента, необходимо сначала преобразовать его в документ:\n\n```php\n$html = $element-\u003etoDocument()-\u003eformat()-\u003ehtml();\n```\n\n#### Внутренний HTML\n\n```php\n$innerHtml = $element-\u003einnerHtml();\n```\n\nМетод `innerHtml()` отсутствует у документа, поэтому, если нужно получить внутренний HTML-код документа, необходимо сначала преобразовать его в элемент:\n\n```php\n$innerHtml = $document-\u003etoElement()-\u003einnerHtml();\n```\n\n### Получение XML\n\n```php\n// XML-код документа\necho $document-\u003exml();\n\n// XML-код элемента\necho $document-\u003efirst('book')-\u003exml();\n```\n\n### Получение содержимого\n\nВозвращает текстовое содержимое узла и его потомков:\n\n```php\necho $element-\u003etext();\n```\n\n## Создание нового элемента\n\n### Создание экземпляра класса\n\n```php\nuse DiDom\\Element;\n\n$element = new Element('span', 'Hello');\n\n// выведет \"\u003cspan\u003eHello\u003c/span\u003e\"\necho $element-\u003ehtml();\n```\n\nПервым параметром передается название элемента, вторым - его значение (необязательно), третьим - атрибуты элемента (необязательно).\n\nПример создания элемента с атрибутами:\n\n```php\n$attributes = ['name' =\u003e 'description', 'placeholder' =\u003e 'Enter description of item'];\n\n$element = new Element('textarea', 'Text', $attributes);\n```\n\nЭлемент можно создать и из экземпляра класса `DOMElement`:\n\n```php\nuse DiDom\\Element;\nuse DOMElement;\n\n$domElement = new DOMElement('span', 'Hello');\n$element = new Element($domElement);\n```\n\n#### Изменение элемента, созданного из `DOMElement`\n\nЭкземпляры класса `DOMElement`, созданные через конструктор (`new DOMElement(...)`), являются неизменяемыми, поэтому и элементы (экземпляры класса `DiDom\\Element`), созданные из таких объектов, так же являются неизменяемыми.\n\nПример:\n\n```php\n$element = new Element('span', 'Hello');\n\n// добавит атрибут \"id\" со значением \"greeting\"\n$element-\u003eattr('id', 'greeting');\n\n$domElement = new DOMElement('span', 'Hello');\n$element = new Element($domElement);\n\n// будет выброшено исключение\n// DOMException with message 'No Modification Allowed Error'\n$element-\u003eattr('id', 'greeting');\n```\n\n### С помощью метода `Document::createElement()`\n\n```php\n$document = new Document($html);\n\n$element = $document-\u003ecreateElement('span', 'Hello');\n```\n\n### С помощью CSS-селектора\n\nПервый параметр - селектор, второй - значение, третий - массив с атрибутами.\n\nАтрибуты элемента могут быть указаны как в селекторе, так и переданы отдельно в третьем параметре.\n\nЕсли название атрибута в массиве совпадает с названием атрибута из селектора, будет использовано значение, указанное в селекторе.\n\n```php\n$document = new Document($html);\n\n$element = $document-\u003ecreateElementBySelector('div.block', 'Foo', [\n    'id' =\u003e '#content',\n    'class' =\u003e '.container',\n]);\n```\n\nМожно так же использовать статический метод `createBySelector` класса `Element`:\n\n```php\n$element = Element::createBySelector('div.block', 'Foo', [\n     'id' =\u003e '#content',\n     'class' =\u003e '.container',\n ]);\n```\n\n## Получение названия элемента\n\n```php\n$element-\u003etagName();\n```\n\n## Получение родительского элемента\n\n```php\n$element-\u003eparent();\n```\n\nТак же можно получить родительский элемент, соответствующий селектору:\n\n```php\n$element-\u003eclosest('.foo');\n```\n\nВернет родительский элемент, у которого есть класс `foo`. Если подходящий элемент не найден, метод вернет `null`.\n\n## Получение соседних элементов\n\nПервый аргумент - CSS-селектор, второй - тип узла (`DOMElement`, `DOMText` или `DOMComment`).\n\nЕсли оба аргумента опущены, будет осуществлен поиск узлов любого типа.\n\nЕсли селектор указан, а тип узла нет, будет использован тип `DOMElement`.\n\n**Внимание:** Селектор можно использовать только с типом `DOMElement`.\n\n```php\n// предыдущий элемент\n$item-\u003epreviousSibling();\n\n// предыдущий элемент, соответствующий селектору\n$item-\u003epreviousSibling('span');\n\n// предыдущий элемент типа DOMElement\n$item-\u003epreviousSibling(null, 'DOMElement');\n\n// предыдущий элемент типа DOMComment\n$item-\u003epreviousSibling(null, 'DOMComment');\n```\n\n```php\n// все предыдущие элементы\n$item-\u003epreviousSiblings();\n\n// все предыдущие элементы, соответствующие селектору\n$item-\u003epreviousSiblings('span');\n\n// все предыдущие элементы типа DOMElement\n$item-\u003epreviousSiblings(null, 'DOMElement');\n\n// все предыдущие элементы типа DOMComment\n$item-\u003epreviousSiblings(null, 'DOMComment');\n```\n\n```php\n// следующий элемент\n$item-\u003enextSibling();\n\n// следующий элемент, соответствующий селектору\n$item-\u003enextSibling('span');\n\n// следующий элемент типа DOMElement\n$item-\u003enextSibling(null, 'DOMElement');\n\n// следующий элемент типа DOMComment\n$item-\u003enextSibling(null, 'DOMComment');\n```\n\n```php\n// все последующие элементы\n$item-\u003enextSiblings();\n\n// все последующие элементы, соответствующие селектору\n$item-\u003enextSiblings('span');\n\n// все последующие элементы типа DOMElement\n$item-\u003enextSiblings(null, 'DOMElement');\n\n// все последующие элементы типа DOMComment\n$item-\u003enextSiblings(null, 'DOMComment');\n```\n\n## Получение дочерних элементов\n\n```php\n$html = '\u003cdiv\u003eFoo\u003cspan\u003eBar\u003c/span\u003e\u003c!--Baz--\u003e\u003c/div\u003e';\n\n$document = new Document($html);\n\n$div = $document-\u003efirst('div');\n\n// элемент (DOMElement)\n// string(3) \"Bar\"\nvar_dump($div-\u003echild(1)-\u003etext());\n\n// текстовый узел (DOMText)\n// string(3) \"Foo\"\nvar_dump($div-\u003efirstChild()-\u003etext());\n\n// комментарий (DOMComment)\n// string(3) \"Baz\"\nvar_dump($div-\u003elastChild()-\u003etext());\n\n// array(3) { ... }\nvar_dump($div-\u003echildren());\n```\n\n## Получение документа\n\n```php\n$document = new Document($html);\n\n$element = $document-\u003efirst('input[name=email]');\n\n$document2 = $element-\u003eownerDocument();\n\n// bool(true)\nvar_dump($document-\u003eis($document2));\n```\n\n## Работа с атрибутами элемента\n\n#### Создание/изменение атрибута\n\n##### Через метод `setAttribute`:\n```php\n$element-\u003esetAttribute('name', 'username');\n```\n\n##### Через метод `attr`:\n```php\n$element-\u003eattr('name', 'username');\n```\n\n##### Через магический метод `__set`:\n```php\n$element-\u003ename = 'username';\n```\n\n#### Получение значения атрибута\n\n##### Через метод `getAttribute`:\n```php\n$username = $element-\u003egetAttribute('value');\n```\n\n##### Через метод `attr`:\n```php\n$username = $element-\u003eattr('value');\n```\n\n##### Через магический метод `__get`:\n```php\n$username = $element-\u003ename;\n```\n\nЕсли атрибут не найден, вернет `null`.\n\n#### Проверка наличия атрибута\n\n##### Через метод `hasAttribute`:\n```php\nif ($element-\u003ehasAttribute('name')) {\n    // код\n}\n```\n\n##### Через магический метод `__isset`:\n```php\nif (isset($element-\u003ename)) {\n    // код\n}\n```\n\n#### Удаление атрибута:\n\n##### Через метод `removeAttribute`:\n```php\n$element-\u003eremoveAttribute('name');\n```\n\n##### Через магический метод `__unset`:\n```php\nunset($element-\u003ename);\n```\n\n#### Получение всех атрибутов:\n\n```php\nvar_dump($element-\u003eattributes());\n```\n\n#### Получение определенных атрибутов:\n\n```php\nvar_dump($element-\u003eattributes(['name', 'type']));\n```\n\n#### Удаление всех атрибутов:\n\n```php\n$element-\u003eremoveAllAttributes();\n```\n\n#### Удаление всех атрибутов, за исключением указанных:\n\n```php\n$element-\u003eremoveAllAttributes(['name', 'type']);\n```\n\n## Сравнение элементов\n\n```php\n$element  = new Element('span', 'hello');\n$element2 = new Element('span', 'hello');\n\n// bool(true)\nvar_dump($element-\u003eis($element));\n\n// bool(false)\nvar_dump($element-\u003eis($element2));\n```\n\n## Добавление дочерних элементов\n\n```php\n$list = new Element('ul');\n\n$item = new Element('li', 'Item 1');\n\n$list-\u003eappendChild($item);\n\n$items = [\n    new Element('li', 'Item 2'),\n    new Element('li', 'Item 3'),\n];\n\n$list-\u003eappendChild($items);\n```\n\n## Замена элемента\n\n```php\n$title = new Element('title', 'foo');\n\n$document-\u003efirst('title')-\u003ereplace($title);\n```\n\n**Внимание:** заменить можно только те элементы, которые были найдены непосредственно в документе:\n\n```php\n// ничего не выйдет\n$document-\u003efirst('head')-\u003efirst('title')-\u003ereplace($title);\n\n// а вот так да\n$document-\u003efirst('head title')-\u003ereplace($title);\n```\n\nПодробнее об этом в разделе [Поиск в элементе](#Поиск-в-элементе).\n\n## Удаление элемента\n\n```php\n$document-\u003efirst('title')-\u003eremove();\n```\n\n**Внимание:** удалить можно только те элементы, которые были найдены непосредственно в документе:\n\n```php\n// ничего не выйдет\n$document-\u003efirst('head')-\u003efirst('title')-\u003eremove();\n\n// а вот так да\n$document-\u003efirst('head title')-\u003eremove();\n```\n\nПодробнее об этом в разделе [Поиск в элементе](#Поиск-в-элементе).\n\n## Работа с кэшем\n\nКэш - массив XPath-выражений, полученных из CSS.\n\n#### Получение кэша\n\n```php\nuse DiDom\\Query;\n\n...\n\n$xpath    = Query::compile('h2');\n$compiled = Query::getCompiled();\n\n// array('h2' =\u003e '//h2')\nvar_dump($compiled);\n```\n\n#### Установка кэша\n\n```php\nQuery::setCompiled(['h2' =\u003e '//h2']);\n```\n\n## Прочее\n\n#### `preserveWhiteSpace`\n\nПо умолчанию сохранение пробелов между тегами отключено.\n\nВключать опцию `preserveWhiteSpace` следует до загрузки документа:\n\n```php\n$document = new Document();\n\n$document-\u003epreserveWhiteSpace();\n\n$document-\u003eloadXml($xml);\n```\n\n#### `matches`\n\nВозвращает `true`, если элемент соответсвует селектору:\n\n```php\n// вернет true, если элемент это div с идентификатором content\n$element-\u003ematches('div#content');\n\n// строгое соответствие\n// вернет true, если элемент это div с идентификатором content и ничего более\n// если у элемента будут какие-либо другие атрибуты, метод вернет false\n$element-\u003ematches('div#content', true);\n```\n\n#### `isElementNode`\n\nПроверяет, является ли элемент узлом типа DOMElement:\n\n```php\n$element-\u003eisElementNode();\n```\n\n#### `isTextNode`\n\nПроверяет, является ли элемент текстовым узлом (DOMText):\n\n```php\n$element-\u003eisTextNode();\n```\n\n#### `isCommentNode`\n\nПроверяет, является ли элемент комментарием (DOMComment):\n\n```php\n$element-\u003eisCommentNode();\n```\n\n## Сравнение с другими парсерами\n\n[Сравнение с другими парсерами](https://github.com/Imangazaliev/DiDOM/wiki/Сравнение-с-другими-парсерами-(1.6.3))\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FImangazaliev%2FDiDOM","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FImangazaliev%2FDiDOM","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FImangazaliev%2FDiDOM/lists"}