今回は、技術ネタで行きます。
以前、phpでXMLプロセッサを作ったときに、罠を発見しました。
XMLプロセッサなんて、phpでxmlパーサーすれば簡単(^^)
なのに、この罠のせいでハマってしまった(^^;
php4→php5で、xml関数の内部仕様が変わったんだそうで。
以下、XML パーサ関数の使い方の違いです。
(ソースから一部抜粋)
php5の書き方で、php4のサーバーで動かすと、
classで定義した変数のスコープ(見た目はグローバル)が
startElementやendElementとの間で引き継がれません。
phpは大好きだけど、こういうとこは嫌いだ(笑)
■■■■■■■■■■■■■■■■■■■■■
■■■ php5の場合
class sample {
var $no = "";
#========================================
# コンストラクター
#========================================
function sample(){
//XMLパーサー作成("UTF-8")
$xml_parser = xml_parser_create("UTF-8");
// 大文字変換を行わない
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
//start および end 要素のハンドラを設定する
xml_set_element_handler($xml_parser, array( $this, "startElement"), array( $this, "endElement"));
//文字データハンドラを設定する
xml_set_character_data_handler($xml_parser, array( $this, "characters"));
if (!($fp = fopen($file, "r"))) {
die("XMLファイルを開けません。");
}
while ($data = fread($fp, filesize($file))) {
//XMLパース処理
if (!xml_parse($xml_parser, $data, feof($fp))) {
//パースエラー処理
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
//XMLパーサの開放
xml_parser_free($this->parser);
:
:
}
#========================================
# テキストノードの値
#========================================
function characters($parser, $text){
:
:
}
#========================================
# 要素の開始
#========================================
function startElement($parser, $name, $attrib){
:
:
}
#========================================
# 要素の終了
#========================================
function endElement($parser, $name){
:
:
}
}
■■■■■■■■■■■■■■■■■■■■■
■■■ php4の場合(php5でも使用可能)
class sample {
var $parser;
var $no = "";
#========================================
# コンストラクター
#========================================
function sample(){
//XMLパーサー作成("UTF-8")
$this->parser = xml_parser_create("UTF-8");
xml_set_object($this->parser, $this);
// 大文字変換を行わない
xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
//start および end 要素のハンドラを設定する
xml_set_element_handler($this->parser, "startElement", "endElement");
//文字データハンドラを設定する
xml_set_character_data_handler($this->parser, "characters");
if (!($fp = fopen($file, "r"))) {
die("XMLファイルを開けません。");
}
while ($data = fread($fp, filesize($file))) {
//XMLパース処理
if (!xml_parse($this->parser, $data, feof($fp))) {
//パースエラー処理
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($this->parser)),
xml_get_current_line_number($this->parser)));
}
}
//XMLパーサの開放
xml_parser_free($this->parser);
:
:
}
#========================================
# テキストノードの値
#========================================
function characters($parser, $text){
:
:
}
#========================================
# 要素の開始
#========================================
function startElement($parser, $name, $attrib){
:
:
}
#========================================
# 要素の終了
#========================================
function endElement($parser, $name){
:
:
}
} |