Содержание


Query


Zend\Dom\Query, ЗФ2, Zend Framework 2, ZF2






Zend\Dom\Query предоставляет механизм для перебора  XML и (X) HTML документов, используя XPath и CSS селекторы. Изначально была разработана для помощи тестирования MVC приложения, однако с легкостью может быть использована для «screen scraper» (технология извлечения и передачи данных, русского перевода нету.)

 

Использовать CSS селекторы намного приятнее или легче при разборе XML структур и схожих с ними, так как они знакомы всем веб-разработчикам. Так же, селекторы знакомы всем, кто хоть когда-то работал с каскадными таблицами стилей (CSS) или с JavaScript.

 


Принцип работы

 

Для работы с Zend\Dom\Query необходимо создать экземпляр объекта Zend\Dom\Query, опционально (не обязательно) можно передать сразу и документ или строку для разбора. К любому документу Вы можете применять методы query() или queryXpath(). Любой из этих методов вернет объект Zend\Dom\NodeList, содержащий заданные объекты(узлы).

 

Основные различия в использовании Zend\Dom\Query и DOMDocument + DOMXPath заключается в возможности использования  селекторов CSS. У Вас есть возможность использовать люое действие и в любой комбинации из следующего списка:

 

1) Типы элементов: задать тип элемента, соответствующего: «div», «a», «span», «h2» и т.д.

 

2) Атрибуты стиля: CSS атрибуты стилей, соответствующие: «.error», «div.error», «label.required» и т.д. Если у элемента задано несколько стилей, то будут выбраны по всем стилям, в которых есть похожие вхождения.

 

3) ID атрибуты: поиск по атрибуту ID: «#content», «div#nav» и т.д.

 

4) Произвольные атрибуты: поиск по произвольным атрибутам. Существует три различных типа соответствия:

  • Точное совпадение: например маске поиска «div[bar=”baz”]» должен соответствовать элемент «div», у которого атрибут «bar» должен иметь точное значение «baz». 
  • Совпадение по слову: маска поиска «div[bar=”baz”]»  подразумевает, что будет найден элемент «div», у которого в атрибуте «bar» должно быть слово  «baz». Такой элемент найдет: <div bar=”foo baz”>. А этот нет: <div bar=”foo bazbat”>.
  • Совпадение по строке: маска поиска «div[bar=”baz”]»  подразумевает, что будет найден элемент «div», у которого в атрибуте «bar» должна быть последовательность символов (строка)  «baz». Оба этих элемента будут найдены: <div bar=”foo baz”> и <div bar=”foo bazbat”>. 

 

4) Прямые потомки:  используйте символ «>» между селекторами, для обозначения прямых потомков. Например, по такой маске: «div > span» будут выбраны все элементы «span», которые являются прямыми потомками элемента «div».

 

5) Потомки. Используйте несколько селекторов в одной строке для задания иерархии выборки необходимых элементов. Например, маске «div .foo span #one» соответствует элемент с ID «one», который является потомком элемента «span» с любой глубиной вложености, который в свою очередь является потомком элемента с классом  «.foo» люой глубины вложености, который в свою очередь является потомком элемента «div».

 

Пример: Выше описанной маске будет соответствовать ссылка «One»:

<div>
<table>
    <tr>
        <td class="foo">
            <div>
                Lorem ipsum <span class="bar">
                    <a href="/foo/bar" id="one">One</a>
                    <a href="/foo/baz" id="two">Two</a>
                    <a href="/foo/bat" id="three">Three</a>
                    <a href="/foo/bla" id="four">Four</a>
                </span>
            </div>
        </td>
    </tr>
</table>
</div>

После выполнения поиска по необходимым параметрам у Вас появляется возможность работать с полученным объектом: вытащить содержимое элемента или обработать сам элемент. Zend\Dom\NodeList предоставляет возможность работы с Счетчиком и Итератором (перебор), а также внутреннее сохранение результата как в DOMDocument и DOMNodeList.

Пример: рассмотрим следующий вызов, который работает с HTML документом, описанным выше:

use Zend\Dom\Query;
 
$dom = new Query($html);
$results = $dom->execute('.foo .bar a');
 
$count = count($results); // get number of matches: 4
foreach ($results as $result) {
    // $result is a DOMElement
}

Так же возможно использование прямых запросов XPath в методе queryXpath(). Вернет объект Zend\Dom\NodeList.

 


Доступные методы

 

Zend\Dom\Query

- setDocumentXml($document, $encoding = null)             

Задает тип документа XML, в котором будет осуществляться поиск.

- setDocumentXhtml($document, $encoding = null)          

Задает тип документа XHTML, в котором будет осуществляться поиск.

- setDocumentHtml($document, $encoding = null)

Задает тип документа HTML, в котором будет осуществляться поиск.         

- setDocument($document, $encoding = null)        

Zend\Dom\Query автоматически определит тип документа, в котором будет осуществляться поиск.

- setEncoding($encoding)     

Задает необходимую кодировку. Если указана, то будет передана в конструктор DOMDocument.

- getDocument()

Возвращает исходный документ. 

- getDocumentType()

Возвращает тип документа. Распознаются такие типы: DOC_XML, DOC_XHTML, или константы класса DOC_HTML 

- getEncoding()

Возвращает заданную кодировку.

- execute($query)      

Поиск по документу в соответствии с указанными CSS селекторами.

- queryXpath($xPathQuery)             

Поиск по документу в соответствии с указанными XPath значениями.

 

 

Zend\Dom\NodeList

 

Как уже говорилось, Zend\Dom\NodeList реализует Счетчик и Перебор, тоесть возможно использование функций count() и foreach() с объектами этого класса. Так же доступны следующие методы:

- getCssQuery()

Возвращает CSS селекторы, которые были использованы для получения результата поиска (если таковые были)

- getXpathQuery()

Возвращает XPath значения, которые были использованы для получения результата поиска. Всегда присутствуют, так как CSS селекторы всегда еще конвертируются в XPath.

 - getDocument()

Возвращает DOMDocument.

 


Автор статьи: DuB