Slide 1

Slide 1 text

Epic PHP #7 Рома Лапин, Evercode Lab

Slide 2

Slide 2 text

XML

Slide 3

Slide 3 text

XML XML (англ. eXtensible Markup Language — расширяемый язык разметки; произносится [экс-эм- э́л]) — рекомендованный Консорциумом Всемирной паутины (W3C) язык разметки.

Slide 4

Slide 4 text

XML

Slide 5

Slide 5 text

XML • RSS • XML-RPC • Ajax

Slide 6

Slide 6 text

XML

Slide 7

Slide 7 text

XML • простой формальный синтаксис • в теории удобен для чтения и компьютеру и человеку • расширяемый • http://ru.wikipedia.org/wiki/XML

Slide 8

Slide 8 text

XML Простой хлеб Мука Дрожжи Тёплая вода Соль Смешать все ингредиенты и тщательно замесить. Закрыть тканью и оставить на один час в тёплом помещении. Замесить ещё раз, положить на противень и поставить в духовку.

Slide 9

Slide 9 text

XML • многословный • а значит тяжелый и объёмный • плохая поддержка типов данных

Slide 10

Slide 10 text

Well Formed XML • Один корневой тэг • Все тэги открыты и закрыты правильно • Каждый узел тоже well formed

Slide 11

Slide 11 text

Валидный XML • Well formed • Содержит указание на DTD • Следует этому DTD • DTD = Document Type Definition

Slide 12

Slide 12 text

PHP + XML • SimpleXML • DOM • XMLReader, XMLWriter, XSLT processor

Slide 13

Slide 13 text

DOM

Slide 14

Slide 14 text

DOM DOM (от англ. Document Object Model — «объектная модель документа») — это не зависящий от платформы и языка программный интерфейс, позволяющий программам и скриптам получить доступ к содержимому HTML, XHTML и XML-документов, а также изменять содержимое, структуру и оформление таких документов.

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

DOM в PHP • Расширение для работы с XML через DOM API • Загружает весь документ в память и создает внутреннее представление в виде дерева

Slide 17

Slide 17 text

DOM $dom = new DomDocument('1.0'); ! $books = $dom->appendChild($dom->createElement('books')); ! $book = $books->appendChild($dom->createElement('book')); ! $title = $book->appendChild($dom->createElement('title')); ! $title->appendChild($dom->createTextNode('Great American Novel')); ! $dom->formatOutput = true; ! $test1 = $dom->saveXML(); // put string in test1 $dom->save('test1.xml'); // save as file

Slide 18

Slide 18 text

DOM Great American Novel

Slide 19

Slide 19 text

DomDocument • createElement() • createTextNode()

Slide 20

Slide 20 text

DomNode • appendChild() • insertBefore() • cloneNode() • removeAttribute() • removeChild()

Slide 21

Slide 21 text

SimpleXML

Slide 22

Slide 22 text

SimpleXML • Легче в использовании, чем DOM • Что понятно из названия • Конструирует объект из xml

Slide 23

Slide 23 text

SimpleXML

Slide 24

Slide 24 text

SimpleXML $xml = new SimpleXMLElement($xmlstr); ! echo $xml->instructions->step[0]; ! foreach ($xml->composition->ingridient as $ingridient) { echo $ingridient[‘unit’] . '
'; }

Slide 25

Slide 25 text

Добавляем узлы • SimpleXMLElement::addChild() • SimpleXMLElement::addAttribute()

Slide 26

Slide 26 text

Добавляем узлы • asXML() • $library->book[0] = null; // удаление • children() • attributes()

Slide 27

Slide 27 text

DOM + SimpleXML

Slide 28

Slide 28 text

DOM + SimpleXML $sxe = simplexml_load_string($someXmlString); if ($sxe === false) { exit; } if (!$dom_sxe = dom_import_simplexml($sxe)) { exit; } $dom = new DOMDocument('1.0'); $dom_sxe = $dom->importNode($dom_sxe, true); $dom_sxe = $dom->appendChild($dom_sxe); echo $dom->save('test2.xml');

Slide 29

Slide 29 text

SimpleXML $dom = new domDocument; $dom->loadXML($xmlString); if (!$dom) { echo 'Error while parsing the document'; exit; } $s = simplexml_import_dom($dom); echo $s->book[0]->title;

Slide 30

Slide 30 text

Задание Напишем простой парсер новостей для RSS сервиса Яндекс.Новости. Выберите любой раздел, например, Туризм. Ссылка на RSS на него будет http://news.yandex.ru/travels.rss. ! Скрипт должен брать RSS по URL и каждый записывать в базу с соответствующими полями: title, link, description, pubDate. При повторном запуске одни и те же новости в базу записываться не должны. ! Что лучше использовать: file_get_contents(), SimpleXML, PDO.

Slide 31

Slide 31 text

XPath $doc = new DOMDocument; ! $doc->preserveWhiteSpace = false; ! $doc->Load('book.xml'); ! $xpath = new DOMXPath($doc); ! $query = '//book/chapter/tgroup/tbody/row/entry[. = "en"]'; ! $entries = $xpath->query($query); ! foreach ($entries as $entry) { echo "Found {$entry->previousSibling->previousSibling->nodeValue}," . " by {$entry->previousSibling->nodeValue}\n"; }

Slide 32

Slide 32 text

XPath • Что-то среднее между регулярками и SQL • Стандарт, поддерживаемый множеством языков • $xpath = new DomXPath($dom) • Вызов DomXpath::query() возвращает объект DomNodeList

Slide 33

Slide 33 text

SOAP

Slide 34

Slide 34 text

Избегайте SOAP как только можно

Slide 35

Slide 35 text

Но если все-таки интересно, то удачи вам!

Slide 36

Slide 36 text

Еще про парсинг • symfony/dom-crawler • symfony/css-selector • fabpot/goutte • не изобретайте велосипед, короче

Slide 37

Slide 37 text

JSON

Slide 38

Slide 38 text

JSON (JavaScript Object Notation)

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

JSON { "one": "A Number", "hello": "world", "myarray": ["orange", "apple", "banana"], "myobject": {"library": "books", "bar": "alcohol"} }

Slide 41

Slide 41 text

JSON functions • json_decode • json_encode • json_last_error_msg • json_last_error

Slide 42

Slide 42 text

JSON $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5); ! $json = json_encode($arr); echo $json; ! var_dump(json_decode($json)); var_dump(json_decode($json, true));

Slide 43

Slide 43 text

Bad JSON $bad_json = "{ 'bar': 'baz' }"; json_decode($bad_json); // null ! $bad_json = '{ bar: "baz" }'; json_decode($bad_json); // null ! $bad_json = '{ bar: "baz", }'; json_decode($bad_json); // null

Slide 44

Slide 44 text

Задание Сделаем небольшой и простой поисковик по сообщениям твиттера. Большинство методов Twitter API требуют регистрации приложения и специальных ключей. Но поиском можно пользоваться без этого. ! index: форма с поисковым полем обработчик: запрос к Twitter API, парсинг json, вывод твитов в виде списка. ! Формат запроса: https://search.twitter.com/search.json?q=epicskills Красиво оформить json для чтения полей: http://jsonlint.com/ Дока для поиска: https://dev.twitter.com/docs/using-search

Slide 45

Slide 45 text

CURL

Slide 46

Slide 46 text

CURL cURL — свободная (распространяемая по лицензии MIT), кроссплатформенная служебная программа командной строки для копирования файлов по различным протоколам с синтаксисом URL.

Slide 47

Slide 47 text

CURL

Slide 48

Slide 48 text

CURL • читает сайты • отправляет формы • загружает файлы • и многое другое • БЕСПЛАТНО И БЕЗ СМС!!111

Slide 49

Slide 49 text

CURL

Slide 50

Slide 50 text

CURL • “Ну и че, это делается с помощью file_get_contents гораздо проще”, скажете вы. • И будете правы. • Но

Slide 51

Slide 51 text

CURL • Что, если вам надо указать какой-нибудь заголовок? Например, HTTP_REFERER. • Или использовать Cookie и сохранить логин пользователя между страницами? • А форму отправить через POST?

Slide 52

Slide 52 text

Закачиваем файл /* http://localhost/upload.php: print_r($_POST); print_r($_FILES); */ ! $ch = curl_init(); ! $data = array('name' => 'Foo', 'file' => '@/home/user/test.png'); ! curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); ! curl_exec($ch);

Slide 53

Slide 53 text

Задание Переделайте скрипты предыдущих заданий на работу через CURL.

Slide 54

Slide 54 text

API

Slide 55

Slide 55 text

API • У кого-то уже есть данные, которые вам нужны • И по API их взять проще, чем парсить сайт • И автоматизировать можно • Да и оптимизировать

Slide 56

Slide 56 text

REST

Slide 57

Slide 57 text

REST • Representational State Transfer • Запросы выглядят, как отправленные формы • Ответ обычно XML или JSON • RESTafarians — это почти растаманы, только более упороты