講習会「XMLをPHPで扱おう (1)SimpleXML」を開催しました

「XMLをPHPで扱おう (1)SimpleXML」というタイトルで社内勉強会を開催しました。XML/DOM/XPathなどの整理とPHPのDOM拡張とSimpleXML拡張でのXML操作のコード例を紹介しました。

まとめ

  • PHPのSimpleXML拡張は、特にXMLの読み出しに関しては便利です。
    • 特にSimpleXMLElement::xpath()が使える場合は最高に便利です。

      • マニュアルによればPHP 5.2.0以降で使えるはずですが、私の実験環境ではPHP 5.0.0から利用できます。謎ですね。

ムービー

発表資料

内容の補足など

プレゼンがボロボロで本人も凹んでます。題材としては悪くなかったと思うんですが、本人の自信や理解度の問題が大きかったですね…。実は今回のプレゼン資料を作る際に初めて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&#211;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ってどれくらい仕事で使うのかなあ?というのもあって少し悩んでいます。実は個人的に講習会の題材選びに苦しんでいるので、もっとナイスなお題がある方はこっそり教えてください。

参考資料

コメント / トラックバック 2 件

#1 halt 2008/05/30 01:15

xpathはseleniumで覚えたよ!
simplexmlならdc:dateとかのとり方の説明は必須ですよね!

#2 hnw 2008/05/30 12:06

あーなるほど、そういえば今回は名前空間の話は回避したんでした。次回はその辺の突っ込んだ話をしてみますかね。早速ナイスなお題を頂いてありがとうございます。

コメントする