第34回php勉強会発表資料 simplexml
DESCRIPTION
TRANSCRIPT
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
ちょっと極めるXML on PHP5
id:sotarokSotaro [email protected]
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
あいかわらず遅刻しててすみません
別に世の中なめてるわけじゃ><
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
Agenda
自己紹介
PHP5 の XML の機能を紹介SimpleXMLを調理するもっとSimpleXMLを使う
もっとXML
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
自己紹介
id:sotarokそーたろー
kはおまけDjango の D みたいなもん
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
このアイコンにピンときたら
twitter.com/sotarokd.hatena.ne.jp/sotarok
その他
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
自己紹介
PHPカンファレンス2008は
7/21です!
みんなきてね!
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
PHP5 の XML の機能
XMLって知ってますよね?<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:content="http://purl.org/rss/1.0/modules/content
/" xml:lang="ja"><channel>
<title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
これまでのPHP
xmlparserPEAR
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
PHP5ではXMLを扱う機能が
大幅に強化されています
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
詳しくは@IThttp://www.atmarkit.co.jp/flinux/rensai/p
hp502/php502a.html
by yudoufu
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
これぞ
まるなげPHP!
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
という冗談はおいといて
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
PHP5 の XML を扱う機能
SimpleXMLXMLReader/WriterDOMDocument
SDOXSL…
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
まぁこんなにあっても
しょうがないので
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
とりあえず
SimpleXML
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
SimpleXMLを調理する
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
インスタンスの生成
simplexml_load_string($some_string);new SimpleXMLElement($some_string);
文字列から
ファイル・URLから
simplexml_load_file($some_file);new SimpleXMLElement($some_file,
null, true);
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
要素へのアクセス
$xml->channel
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0“ xml:lang="ja">
<channel><title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
要素へのアクセス
$xml->channel->title
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0“ xml:lang="ja">
<channel><title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
要素へのアクセス
$xml->channel->link
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0“ xml:lang="ja">
<channel><title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
DEMO
RSSからタイトル一覧を取得する
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
4行
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
ちなみにこうすると3行
<?php
foreach (simplexml_load_file("rss2.xml")->channel->item as $val) {
echo $val->title . "¥n";}
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
属性へのアクセス
$xml->attributes()->version
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0“ xml:lang="ja">
<channel><title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
(こんな風にもアクセスできます)(記号とかが入ってたら{“”}で囲む)
$xml->{“@attributes”}->version
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
名前空間付き要素へのアクセス
xml namespace<?xml version="1.0" encoding="utf-8" ?><rss version="2.0“
xmlns:dc="http://purl.org/dc/elements/1.1/“xmlns:content="http://purl.org/rss/1.0/modules/content/" xml:lang="ja"><channel>
<title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link> <description>GRANADA Hatena @ sotarok</description> <dc:creator>sotarok</dc:creator>
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
$xml->channel->{“dc:creator”}
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
$xml->channel->children(“http://purl.org/dc/elements/1.1/”)->creator
名前空間付き要素へのアクセス
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
xpath
xpathしってますかー?
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
xpath
XPath は、XML ドキュメントの一部をアドレッシングするための言語であり、XSLT および XPointer で使用するように設計されている。
http://www.infoteria.com/jp/contents/xml-data/REC-xpath-19991116-jpn.htm
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
代表的なxpath式
id(‘ID’)//hoge
//hoge/@fuga//hoge[@fuga]
idがIDである要素hogeノードhogeノードのfuga属性hogeノードで属性fuga有
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
DEMO
xpathを使ってRSSからタイトル一覧を取得
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
ここまでがSimpleXMLの基本的な機能(だいたい)
書き込む方の紹介してないけど
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
もっとSimpleXMLを使う
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
DOMDocumentと連携して簡単にスクレイピング
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
DOMDocument ⇔ SimpleXML自在に変換可能
simplexml_import_domdom_import_simplexml
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
DEMO
DOMDocumentとxpathを使ってTwitterから発言一覧を取り出す
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
ちょっとしたチューニング
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
インスタンス生成時のオプション
$xml = simplexml_load_string($some_string, ‘SimpleXMLElement’,LIBXML_COMPACT
);
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
DEMO
LIBXML_COMPACT使った場合と使っていない場合の比較
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
ただまぁ
スペックの高いマシンでは
ほとんど差がでませんでした
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
SimpleXMLIterator
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
インスタンス生成時のオプション
$xml = simplexml_load_string($some_string, ‘SimpleXMLIterator’
);
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
なにが違うか
ちょっとサンプル
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
つーかこういう使い方しちゃだめ
$xml->hogehoge[$i]->fugafuga
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
とかちゃんと調べずに言ってますが,
今度余裕があれば中身まで
だれか...(ぉ
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
XMLReader
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
結論から言えば
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
存在価値のわからないモジュール
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
というのはちょっと言いすぎで
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
そのまえに
DOMの復習
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
カーソル
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:content="http://purl.org/rss/1.0/modules/content
/" xml:lang="ja"><channel>
<title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
ノードタイプノードタイプノードタイプノードタイプ
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
カーソル
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:content="http://purl.org/rss/1.0/modules/content
/" xml:lang="ja"><channel>
<title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
開始開始開始開始ノードノードノードノード
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
カーソル
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:content="http://purl.org/rss/1.0/modules/content
/" xml:lang="ja"><channel>
<title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
Significant Whitespaceノードノードノードノード
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
カーソル
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:content="http://purl.org/rss/1.0/modules/content
/" xml:lang="ja"><channel>
<title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
開始開始開始開始ノードノードノードノード
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
カーソル
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:content="http://purl.org/rss/1.0/modules/content
/" xml:lang="ja"><channel>
<title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
Significant Whitespaceノードノードノードノード
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
カーソル
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:content="http://purl.org/rss/1.0/modules/content
/" xml:lang="ja"><channel>
<title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
開始開始開始開始ノードノードノードノード
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
カーソル
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:content="http://purl.org/rss/1.0/modules/content
/" xml:lang="ja"><channel>
<title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
テキストノードテキストノードテキストノードテキストノード
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
カーソル
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:content="http://purl.org/rss/1.0/modules/content
/" xml:lang="ja"><channel>
<title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
終了終了終了終了ノードノードノードノード
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
という風に進みます・・・
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
とりあえず使ってみる
$xml = new XMLReader();$xml->open(“rss2.xml”);
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
要素はプロパティに入っている
echo $xml->name;echo $xml->value;
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
DEMO
カーソルの動き方
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
たぶん
まじめに仕様にしたがってやったら
XMLReaderなんだろうなー
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
でもそこはPHP
PHP=
ラッパー・テンプレート言語
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
SimpleXMLだと$xml->channel->title
<?xml version=“1.0” encoding=“utf-8” ?><rss version="2.0“ xml:lang="ja">
<channel><title>GRANADA Hatena @ sotarok</title><link>http://d.hatena.ne.jp/sotarok/</link>
...
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
楽チン
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
そういうわけで
存在価(r
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
メリット(たぶん)
メモリ使用量
(実行速度は若干遅)
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
XMLReaderについてはサンプルはネット上に
あまりころがっていない
(IBMのサイトに良い記事あった!)
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
まぁマニュアル見ればOK(結構充実している)
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
まとめ
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
PHP5でのXMLの機能はかなり強い
SimpleXML -> 早い・簡単XMLReader -> がんばる
Copyright (c) sotarok 2008, Attribution-NonCommercial Creative Commons
おわり