トップページ > こいさんの「知っとく?コラム」 > 明日は明日の風が吹く > 第9回 phpでXMLプロセッサ

2007年07月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
第10回 あのサイトをもう一度!
第9回 phpでXMLプロセッサ
第8回 新キャラクターの『カツオ』
第7回 feferer? referrer?
第6回 10万円以下のFAXサーバ
第5回 裏技?
第4回 これからはナノテク?
第3回 Apache de お約束 「libiconv.so.2が無い!?」
第2回 ブラウザを使わず、サイトのソースを見る裏技
第1回 おしゃべりPerl
2007年07月18日
第9回 phpでXMLプロセッサ

今回は、技術ネタで行きます。

以前、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){
          :
          :
}

}

17:32







明日は明日の風が吹く
2007年07月
2007年06月
2007年05月
2007年04月
2007年03月
2007年02月
氏名:こいさん
出身:東京
生年:1966年生
血液:A型
趣味:酒
性格:江戸っ子気質

IT業界歴:20年
Web暦:14年

基本的にチャレンジャーなので、結構波乱万丈。
(下記はごく一部の出来事)
1986年
IT業界デビュー
1996年
世界初の豆腐店のWebサイトを構築
NHKテレビ「日曜プラザ」に出演
FM J-Wave「Pazz & Jops」に出演
その他、数多の雑誌に登場
:
紆余曲折の人生(笑)
:
2004年
やくざに眉間を殴られ九死に一生を得る
2006年
某女性向け転職支援サイトを
要件定義〜DB設計〜設計〜製造まで1人で4ヶ月で構築
(ありえない)
2006年
株式会社ウェブキャリア入社
■copyright(c)2006 Web-Carrer Inc. All Rights Reserved
繝帙シ繝