PXT Toolbox

PxXMLDomParser

XML DOMを解析するPHP用ライブラリ。

PxXMLDomParserは、XHTMLなどのXMLファイルをDOM解析し、特定の部分を抜き出したり、書き換えたりするためのPHPクラスライブラリです。

他のクラスに依存することなく単体で動作します。オリジナルのクラス名は PxXMLDomParser となっていますが、環境に合わせて任意に変更しても動作します。ただし、コンストラクタの関数名も同名にしてください。

ダウンロード

次のボタンをクリックして、PxXMLDomParser をダウンロードしてください。

PxXMLDomParser_1.0.2.zip (9411 bytes)
MD5 : cb6078d7c2f6835fe79e731a397af246
Release Date : 2010/09/08

ファイル構成

PxXMLDomParser.php
PxXMLDomParserライブラリの本体です。
docs/readme.txt
お読みくださいテキストです。

インストール

PHPのお使いの環境の任意の場所に設置してください。PHP4系でも動作するように設計されています。

ただし、mbstring が有効である必要があります。

更新履歴

PxXMLDomParser 1.0.2 (2010/09/08)

  • 属性がない要素をreplace()した時にforeach構文でエラーが起こる不具合を修正。

PxXMLDomParser 1.0.1 (2010/08/15)

  • PHP5系で、大きなデータを扱うと正しく解析できないことがある不具合を修正。
  • 設定を入出力するためのメソッド config() を追加。
  • 設定項目 tags_case_sensitive を追加。タグの大文字小文字を区別するかどうか。デフォルトを「区別する」にした。
  • 設定項目 atts_case_sensitive を追加。属性の大文字小文字を区別するかどうか。デフォルトを「区別する」にした。

PxXMLDomParser 1.0.0 (2010/01/13)

  • 初版リリース

使い方

基本的な使い方

<?php
    require_once( './PxXMLDomParser.php' );
    $bin = file_get_contents( './sample.xml' );
    $obj = new PxXMLDomParser( $bin , 'bin' );
    $found = $obj->find( 'element' );
    var_dump( $found );
?>

コンストラクタの第1引数に解析する対象 $bin を、第2引数に解析対象の種類 $input_type を指示します。

$input_type には次の何れかを受け付けます。

bin
XMLソース
path
XMLのパス(またはURL)

path が指定された場合には、PHPの file_get_contents() 関数によってソースを開きます。

省略した場合、与えられた $bin によって自動的に選択されます。

設定する

config()メソッドを通じて、パーサーの動作を設定できます。設定は、オブジェクトをインスタンス化した直後に行います。

<?php
    require_once( './PxXMLDomParser.php' );
    $bin = file_get_contents( './sample.xml' );
    $obj = new PxXMLDomParser( $bin , 'bin' );
    $obj->config('tags_case_sensitive',true);
    $found = $obj->find( 'element' );
    var_dump( $found );
?>

設定できる項目は下記の通りです。

設定項目 説明
tags_case_sensitive bool タグの大文字小文字を区別するかどうか。デフォルトは true (区別する)。
atts_case_sensitive bool 属性の大文字小文字を区別するかどうか。デフォルトは true (区別する)。

要素を検索する

find( $selector ) を使用します。

<?php
    require_once( './PxXMLDomParser.php' );
    $obj = new PxXMLDomParser( './sample.xml' , 'path' );
    $found = $obj->find( 'element' );
    var_dump( $found );
?>

この例では、全ての<element>タグを検索しています。返される値 $found は、検索された全ての結果を含む配列です。

得られたそれぞれの要素は、次の値を持つ連想配列となります。

innerHTML
対象要素の内容
outerHTML
対象要素の内容(対象タグ自体を含む)
attributes
対象要素の属性(連想配列)

find() の第1引数 $selector には、CSSのセレクタと同様の形式で対象の要素を指定します。(ただし、一部の機能のみ対応しています)

* クラス指定

$found = $obj->find( '.classname' );

* ID指定

$found = $obj->find( '#classname' );

* 属性指定

$found = $obj->find( 'element[att=value]' );

* 子孫指定

$found = $obj->find( 'elm1 elm2 elm3' );

* 子供指定

$found = $obj->find( 'elm1 > elm2 > elm3' );

要素を書き換える

要素を書き換えるには、メソッド replace( $callback ) を使用します。

* グローバル関数を指定する場合

<?php
    function callback( $dom , $num ){
        $dom['outerHTML'] = '<div>置き換えました</div>';
        return $dom['outerHTML'];
    }
    require_once( './PxXMLDomParser.php' );
    $obj = new PxXMLDomParser( './sample.xml' , 'path' );
    $obj->select( 'element' );
    $obj->replace( 'callback' );
    $final_bin = $obj->get_src();
?>

* スタティッククラスのメソッドを指定する場合

<?php
    class hoge{
        function callback( $dom , $num ){
            $dom['outerHTML'] = '<div>置き換えました</div>';
            return $dom['outerHTML'];
        }
    }
    require_once( './PxXMLDomParser.php' );
    $obj = new PxXMLDomParser( './sample.xml' , 'path' );
    $obj->select( 'element' );
    $obj->replace( array( 'hoge' , 'callback' ) );
    $final_bin = $obj->get_src();
?>

* オブジェクトのメソッドを指定する場合

<?php
    class hoge{
        function callback( $dom , $num ){
            $dom['outerHTML'] = '<div>置き換えました</div>';
            return $dom['outerHTML'];
        }
    }
    require_once( './PxXMLDomParser.php' );
    $obj = new PxXMLDomParser( './sample.xml' , 'path' );
    $obj->select( 'element' );
    $callback_obj = new hoge();
    $obj->replace( array( $callback_obj , 'callback' ) );
    $final_bin = $obj->get_src();
?>

* 匿名関数を指定する場合

<?php
    $callback = create_function(
      '$dom , $num' ,
      '$dom[\'outerHTML\'] = \'<div>置き換えました</div>\'; return $dom[\'outerHTML\'];'
    );
    require_once( './PxXMLDomParser.php' );
    $obj = new PxXMLDomParser( './sample.xml' , 'path' );
    $obj->select( 'element' );
    $obj->replace( $callback );
    $final_bin = $obj->get_src();
?>

著作権と利用についての規約

  • PxXMLDomParser の著作権は、Tomoya Koyanagi に帰属します。
  • 商用利用、個人利用を問わず自由に利用できます。
  • ただし、これらのソースコードやアプリケーションに起因するいかなる損害やトラブルに関しても、著作者は責任を負うことはできませんので、利用者の自己責任の範囲でご利用ください。