Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Epic PHP #7

Roma
March 20, 2014

Epic PHP #7

Слайды к седьмому занятию курса Epic PHP (http://epixx.ru/epic-php/).
Темы: xml, json, curl, API

Roma

March 20, 2014
Tweet

More Decks by Roma

Other Decks in Programming

Transcript

  1. XML

  2. XML XML (англ. eXtensible Markup Language — расширяемый язык разметки;

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

  4. XML

  5. XML • простой формальный синтаксис • в теории удобен для

    чтения и компьютеру и человеку • расширяемый • http://ru.wikipedia.org/wiki/XML
  6. XML <recipe name="хлеб" preptime="5" cooktime="180"> <title>Простой хлеб</title> <composition> <ingredient amount="3"

    unit="стакан">Мука</ingredient> <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient> <ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient> <ingredient amount="1" unit="чайная ложка">Соль</ingredient> </composition> <instructions> <step>Смешать все ингредиенты и тщательно замесить.</step> <step>Закрыть тканью и оставить на один час в тёплом помещении.</step> <!-- <step>Почитать вчерашнюю газету.</step> - это сомнительный шаг... --> <step>Замесить ещё раз, положить на противень и поставить в духовку.</step> </instructions> </recipe>
  7. Well Formed XML • Один корневой тэг • Все тэги

    открыты и закрыты правильно • Каждый узел тоже well formed
  8. Валидный XML • Well formed • Содержит указание на DTD

    • Следует этому DTD • DTD = Document Type Definition
  9. DOM

  10. DOM DOM (от англ. Document Object Model — «объектная модель

    документа») — это не зависящий от платформы и языка программный интерфейс, позволяющий программам и скриптам получить доступ к содержимому HTML, XHTML и XML-документов, а также изменять содержимое, структуру и оформление таких документов.
  11. DOM в PHP • Расширение для работы с XML через

    DOM API • Загружает весь документ в память и создает внутреннее представление в виде дерева
  12. 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
  13. SimpleXML • Легче в использовании, чем DOM • Что понятно

    из названия • Конструирует объект из xml
  14. SimpleXML $xml = new SimpleXMLElement($xmlstr); ! echo $xml->instructions->step[0]; ! foreach

    ($xml->composition->ingridient as $ingridient) { echo $ingridient[‘unit’] . '<br />'; }
  15. 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');
  16. 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;
  17. Задание Напишем простой парсер новостей для RSS сервиса Яндекс.Новости. Выберите

    любой раздел, например, Туризм. Ссылка на RSS на него будет http://news.yandex.ru/travels.rss. ! Скрипт должен брать RSS по URL и каждый <item> записывать в базу с соответствующими полями: title, link, description, pubDate. При повторном запуске одни и те же новости в базу записываться не должны. ! Что лучше использовать: file_get_contents(), SimpleXML, PDO.
  18. 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"; }
  19. XPath • Что-то среднее между регулярками и SQL • Стандарт,

    поддерживаемый множеством языков • $xpath = new DomXPath($dom) • Вызов DomXpath::query() возвращает объект DomNodeList
  20. JSON { "one": "A Number", "hello": "world", "myarray": ["orange", "apple",

    "banana"], "myobject": {"library": "books", "bar": "alcohol"} }
  21. 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));
  22. 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
  23. Задание Сделаем небольшой и простой поисковик по сообщениям твиттера. Большинство

    методов 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
  24. CURL cURL — свободная (распространяемая по лицензии MIT), кроссплатформенная служебная

    программа командной строки для копирования файлов по различным протоколам с синтаксисом URL.
  25. CURL • читает сайты • отправляет формы • загружает файлы

    • и многое другое • БЕСПЛАТНО И БЕЗ СМС!!111
  26. CURL • “Ну и че, это делается с помощью file_get_contents

    гораздо проще”, скажете вы. • И будете правы. • Но
  27. CURL • Что, если вам надо указать какой-нибудь заголовок? Например,

    HTTP_REFERER. • Или использовать Cookie и сохранить логин пользователя между страницами? • А форму отправить через POST?
  28. Закачиваем файл /* 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);
  29. API

  30. API • У кого-то уже есть данные, которые вам нужны

    • И по API их взять проще, чем парсить сайт • И автоматизировать можно • Да и оптимизировать
  31. REST • Representational State Transfer • Запросы выглядят, как отправленные

    формы • Ответ обычно XML или JSON • RESTafarians — это почти растаманы, только более упороты