「XMLをPHPで扱おう (1)SimpleXML」というタイトルで社内勉強会を開催しました。XML/DOM/XPathなどの整理とPHPのDOM拡張とSimpleXML拡張でのXML操作のコード例を紹介しました。
まとめ
- PHPのSimpleXML拡張は、特にXMLの読み出しに関しては便利です。
- 特にSimpleXMLElement::xpath()が使える場合は最高に便利です。
- マニュアルによればPHP 5.2.0以降で使えるはずですが、私の実験環境ではPHP 5.0.0から利用できます。謎ですね。
- 特にSimpleXMLElement::xpath()が使える場合は最高に便利です。
ムービー
発表資料
内容の補足など
プレゼンがボロボロで本人も凹んでます。題材としては悪くなかったと思うんですが、本人の自信や理解度の問題が大きかったですね…。実は今回のプレゼン資料を作る際に初めてXMLの仕様を読んだのですが、自分として新しい発見が何点かありました。例えば、XHTMLのid属性に関して、同じ文章中で同じ属性値は1回しか登場できませんが、私はこれがXMLによる制約だと思い込んでいました。でも実は違うんですよね。XMLでは、属性がID型であれば同じ属性値は文章中に1回しか出現できないんですけど、属性名がidの属性がID型だとは決めていません。この辺ってDTDやXMLスキーマを自分で書いたことがある人なら常識的な内容だろうと思うんですが、残念ながら常識が足りていませんでした。
普段だとサンプルコードはチラ見せくらいなのですが、今回は結構重要な部分だったので記事にも貼り付けておきます。また、これらについて完全に動くPHPコードを固めて置いておきます。ダウンロード:simplexml-sample.tgz
<?xml version='1.0' standalone='yes'?> <movies> <movie> <title>PHP: Behind the Parser</title> <characters> <character> <name>Ms. Coder</name> <actor>Onlivia Actora</actor> </character> <character> <name>Mr. Coder</name> <actor>El ActÓr</actor> </character> </characters> <plot> So, this language. It's like, a programming language. Or is it a scripting language? All is revealed in this thrilling horror spoof of a documentary. </plot> <rating type="thumbs">7</rating> <rating type="stars">5</rating> </movie> <movie> <title>round</title> <characters> <character> <name>id:hnw</name> <actor>hanawa</actor> </character> </characters> </movie> </movies>
上記のXMLから、「moviesの子要素のmovieの子要素のcharactersの子要素のcharacterの子要素のname要素の値を全て表示する」というのが今回の例題です。DOMだと下記のようになります。
$movies = $dom->getElementsByTagname("movie"); foreach ($movies as $movie) { $characters = $movie->getElementsByTagname("characters") ->item(0) ->getElementsByTagname("character"); foreach ($characters as $character) { $name = $character->getElementsByTagname("name")->item(0); echo $name->nodeValue, "\n"; } }
それがSimpleXMLならこの通り。
$movies = $xml->movie; foreach ($movies as $movie) { $characters = $movie->characters->character; foreach ($characters as $character) { echo $character->name, "\n"; } }
xpathメソッドを使えばもっと簡単に。
$names = $xml->xpath('/movies/movie/characters/character/name'); foreach ($names as $name) { echo $name, "\n"; }
そんなわけで、XPathは素晴らしいという結論でした。
次回はXPathの詳細を話そうかと思っていたのですが、XPathってどれくらい仕事で使うのかなあ?というのもあって少し悩んでいます。実は個人的に講習会の題材選びに苦しんでいるので、もっとナイスなお題がある方はこっそり教えてください。
参考資料
- XML 1.0仕様
- DOM仕様
- XPath 1.0仕様
- XSLT 1.0 & XPath 1.0 Quick Reference(PDF) チートシート的なPDFです。1ページ目の左半分さえあれば、カンのいい人なら大抵のXPathが書けると思います。

コメント / トラックバック 2 件
xpathはseleniumで覚えたよ!
simplexmlならdc:dateとかのとり方の説明は必須ですよね!
あーなるほど、そういえば今回は名前空間の話は回避したんでした。次回はその辺の突っ込んだ話をしてみますかね。早速ナイスなお題を頂いてありがとうございます。
コメントする