XML初心者のためのPHP解析についての解説

このQ&Aのポイント
  • XML初心者のために、PHPの解析について解説します。
  • EditableGridクラスを例にとって、PHPのXML解析の方法を紹介します。
  • addColumn関数やgetXML関数、getRowXML関数など、具体的なコードを通じて解説します。
回答を見る
  • ベストアンサー

XML初心者です。

いつもお世話になっております。 下記のPHPを解析中なのですが、さっぱり分かりません。 「何をしているか(どんな動きをしているか)」をどなたか解説していただけませんでしょうか。 よろしくお願い致します。 ----------------------------------- <?php class EditableGrid { (略) public function addColumn(・・・(略)・・・) { $this->columns[$name] = array(・・・(略)・・・); } private function _getRowField($row, $field) { return is_array($row) ? (isset($row[$field]) ? $row[$field] : '') : (isset($row->$field) ? $row->$field : ''); } public function getXML((・・・(略)・・・)); { $xml = '<?xml version="1.0" encoding="'. $this->encoding . '" ?>'; $xml.= "<table><metadata>\n"; foreach ($this->columns as $name => $info) { $label = self::escapeXML($info['label']); $xml.= "<column name='$name' label='$label' datatype='{$info['type']}'". ($info['bar'] ? "" : " bar='false'") . " editable='". ($info['editable'] ? "true" : "false") . "'>\n"; if (is_array($info['values'])) { $xml.= "<values>\n"; foreach ($info['values'] as $key => $value) $xml.= "<value value='{$key}'><![CDATA[{$value}]]></value>\n"; $xml.= "</values>\n"; } $xml.= "</column>\n"; } $xml.= "</metadata><data>\n"; $fetchMethod = method_exists($rows, 'fetch') ? 'fetch' : (method_exists($rows, 'fetch_assoc') ? 'fetch_assoc' : NULL); if (!$fetchMethod) foreach ($rows as $row) $xml.= $this->getRowXML($row, $customRowAttributes, $encodeCustomAttributes); else while ($row = call_user_func(array($rows, $fetchMethod))) $xml.= $this->getRowXML($row, $customRowAttributes, $encodeCustomAttributes); $xml.= "</data></table>\n"; return $xml; } ----------以下まだ続くのですが省略します-------- private function getRowXML  ・  ・ (略)  ・  ・ public function renderXML  ・  ・ (略)  ・  ・ } 以上

  • PHP
  • 回答数2
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • 0909union
  • ベストアンサー率39% (325/818)
回答No.2

サンプルを載せておいて、何なのか聞いてもなあ~。 何が聞きたいのか、ちゃんと的をしぼらないと。 通常、このファイルの前後があるので、それから何をするのか、このファイルの最初と最後をみれば、想像付くはずなんですが。 逆に言えば、No1さんのような、目的は創造の域をでない。 XML初心者とあるが、これが一番こまったちゃん。なんて答えたらいいのやらと皆さん困るのです。 ちゃんと自分なりに、見解を述べるといいです。じゃないと、どこから説明していいのやら。 だれが見ても、XMLのインスタンス(ソースコード)の作成で、それぞれのDB(どこかで取得したデーター類、及びクライアントからのインプットデーター)を元にXMLソースを作成しているだけの箇所です。 それ以上でも、それ以下でもない。 XMLで扱う利点は、RDBデーターからHTMLデーターへのトランスフォーム(フォーマット)が理路整然と簡単に出来ることにあります。 さらに言えば、他のプロセス又はトランザクションに渡すための成型データーとしてはとっても扱いやすいことです。これは他のプロセスが、JavaやC#, C++やスクリプト言語でも、そのまま受け取れるからです。 No1さんが言うところのクライアントとは何をさすかは、わかりませんが、他のプロセスをクライアント同意義語としてもいいでしょう。 このサンプルで成型されたXMLデーターを何に使うかは、他のファイル又は、ここ記載されていないところに、ヒントがあります。 ただ一つ「<table>」タグがあるので、「表を作成する」と判断するのは思料がたりません。「public function renderXML」があるのでXSLTなどでフォーマットを考えていると、思わせる単語でファンクションを作成している。単にXMLでRDBを作成しているだけの場合もあります。私もよくクライアントツールで使う手です。CSVやINIファイルよりも扱いやすい。 結局は、ソースを作成する部分しか記載が無いので、何をしたいのか不明です。

idera_2010
質問者

お礼

ご丁寧にご回答ありがとうございます。 まず何をしているものなのかを知りたく、思わず質問してしまいました。 次回から具体的に質問させていただきます。 このたびは貴重なご意見ありがとうございました。

その他の回答 (1)

  • NARH
  • ベストアンサー率82% (88/107)
回答No.1

クラス定義している。 クラス名から、編集可能な表のためのクラスと想像できる。 XML操作をしているので、クライアントはXMLデータを受け取って表に整形しているのではないかと想像できる。 メソッド名から、クライアントがカラムの追加のような操作をした場合に、リクエストを受け取って、追加したカラムデータを含んだXMLデータ再度作成してクライアントにおくっているのではないかと想像できる。 この部分はクラス定義でしかなく、 static メソッドでもないので、ソースコード中のどこかでインスタンスを作成している箇所があるはず。 なければ、実装したが使われなくなったコードとなった可能性がある。 こんなとこでしょうか。

idera_2010
質問者

お礼

ご回答ありがとうございます。 抽象的な質問内容にも関わらず、ご丁寧に解説して頂きましてありがとうございました。 是非参考にさせていただきます。

関連するQ&A

  • PHPのエラー対処法を教えてください!

    いつもお世話になっております。 添付のPHPにエラーがあり、正しく動作してくれません。 どなたかご教授いただけませんでしょうか。 --環境-- ドキュメントの型宣言:HTML4.01 Frameset セカンダリスキーマ:HTML4.01 Frameset --不明な点(修正したい箇所)-- (1)黄色に表示されているエラー(下記の「($this-)>」が黄色になっています) $xml = "<row id=> foreach ($customRowAttributes as $name = $field) $xml.= " {$name}='" . ($encodeCustomAttributes ? base64_encode($this->_getRowField($row, $field)) : $this->_getRowField($row, $field)) . "'"; $xml.= "\n"; (2)<table><metadata><values><row><column>の波線 ※「HTML4.01 Framesetでは、タグ<table>が親タグの中に含まれる必要があります。」 ※「HTML4.01 Framesetでは、<metadata>(<values><row><column>)タグは利用できません。」 ※添付が見えにくくてすいません。 上記(<metadata>など)はHTML4.01以外であれば使用できるのでしょうか?それとも他に書き方があるのでしょうか。 --XML側のコード-- <?xml version="1.0" encoding="utf-8"?> <table> <metadata> <column name="name" label="NAME" datatype="string" editable="true"/> <column name="firstname" label="FIRSTNAME" datatype="string" editable="true"/> <column name="age" label="AGE" datatype="integer" editable="true"/> <column name="height" label="HEIGHT" datatype="double(m, 2)" editable="true"/> <column name="continent" label="CONTINENT" datatype="string" editable="true"> <values> <value value="eu">Europe</value> (・・・略・・・) </values> </column> <column name="country" label="COUNTRY" datatype="string" editable="true"> <!-- These values will be ignored when using demo.js because in this file we declare a custom enumeration provider --> <values> <value value="be">Belgium</value> (・・・略・・・) </values> </column> <column name="email" label="EMAIL" datatype="email" editable="true"/> <!--column name="website" label="WEBSITE" datatype="url" editable="true"/--> <column name="freelance" label="FREELANCE" datatype="boolean" editable="true"/> <column name="lastvisit" label="LAST VISIT" datatype="date" editable="true"/> <column name="action" label="" datatype="html"/> </metadata> <data> <row id="1"> (・・・略・・・) </row> (・・・省略・・・)※テーブルの内容になります。 </data> </table> 以上

    • ベストアンサー
    • PHP
  • xmlから配列で取得したものを取り出したい

    as3初心者jpncan15といいます。 xmlから配列で取得したものをfunction外で取り出したいのですがどのようにすればいいのか悩んでいます。functionを調べたり配列を調べたり頭がかなり混乱中です。 お手数ですがご教授いただけますでしょうか? var ary:Array=new Array(); var ary_name:Array=new Array(); var loader:URLLoader = new URLLoader(); var request:URLRequest = new URLRequest("b.xml"); var xml:XML; loader.load(request); loader.addEventListener(Event.COMPLETE , XMLload); function XMLload(e:Event):void { xml = XML(e.target.data); num_txt.text = xml.item.length(); //xml件数をテキストフィールドへ入れる for each(var element:Object in xml.item.thumb) //配列に入れる {ary.push(element);} for each(var element_name:Object in xml.item.name) //配列に入れる {ary_name.push(element_name); trace(element_name);}//出力OK } //function外で配列を使用したい trace(ary[5]); trace(ary_name[2]);

    • ベストアンサー
    • Flash
  • XMLでこんなの作りたい。

    [ 環境 ] OS:WindowsXP Pro PHP:5.3.1 Apache:2.2.14 DBServer:SQLServer2005 EXPRESS [ 質問 ] DB側データ row,level,level_name 0,level1,root 1,level2,admin という様なデータをXMLにて以下の様な表示にしたい。 <?xml version="1.0" encoding="UTF-8" ?> <result> <row row="0"> <level>level1</level> <level_name>root</level_name> </row> <row row="1"> <level>level2</level> <level_name>admin</level_name> </row> </result> この場合、以下のソースをどの様に変更したら良いか アドバイスを頂けたらと思います。 <?php // SQLServerとの接続 require("connect-sqlserver.php"); // XML 生成 $dom = new DOMDocument("1.0"); $node = $dom->createElement("result"); $parnode = $dom->appendChild($node); // MSSQLSERVR への接続セット $db = mssql_connect($server, $userid, $passwd); mssql_select_db($dbName, $db); // [SYSW_LEVEL]テーブルからフィールド情報取得 $query = "SELECT * FROM SYSW_LEVEL"; $res = mssql_query($query, $db); header("Content-type: text/xml"); // XMLへフィールドの値を渡す while ($row = mssql_fetch_assoc($res)) { $node = $dom->createElement("row"); $newnode = $parnode->appendChild($node); $newnode->setAttribute("level", $row['LVL_LEVEL']); $newnode->setAttribute("level_name", mb_convert_encoding($row['LVL_LEVELNAME'],'UTF-8','CP932')); } $dom->encoding="UTF-8"; echo $dom->saveXML(); ?> 以上、よろしくお願い致します。

    • 締切済み
    • PHP
  • XMLの相対パスの書き方

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> <root> <info> <element> <item>Pwd</item> <value>00000000000000</value> </element> <element> <item>Name</item> <value>MyPC</value> </element> </info> </root> こういうXMLファイルの記述があり、itemがNameであるvalueを取りたいといった場合、どういうパスを記述すればよいでしょうか? VBで動くようにしたいです。 よろしくお願いします。

    • ベストアンサー
    • XML
  • cakePHPのエラー

    Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'validateSearch' at line 1 SQL Query: validateSearch Notice: If you want to customize this error message, create app/View/Errors/pdo_error.ctp というエラーが出て困っています。 validateSearchの付近を確認してもよくわかりません。 searchpluginを使っているのですが、上手くいきません。 コントローラーは、 <?php App::uses('AppController', 'Controller'); class Mac554FoodDatasController extends AppController { public $name='Mac554FoodDatas'; public $components =array('Search.Prg'); public $presetVars=array(); public function beforeFilter() { //検索対象のフィールド設定代入 $this->presetVars = $this->Mac554FoodData->presetVars; // ページャ設定 $pager_numbers = array( 'before' => ' - ', 'after'=>' - ', 'modulus'=> 10, 'separator'=> ' ', 'class'=>'pagenumbers' ); $this->set('pager_numbers', $pager_numbers); } public function find() { $datas=$this->Mac554FoodData->find('all'); $this->set('datas',$datas); //検索条件設定 $this->Prg->commonProcess(); //検索条件取得 $tabe=$this->passedArgs; $conditions = $this->Mac554FoodData->parseCriteria['$tabe']; //ページャ関係 $this->paginate =array( 'conditions' => $conditions, 'limit' =>10 ); $this->set('Mac554FoodDatas',$this->paginate('Mac554FoodData')); // レイアウト関係 $this->layout = "plain"; $this->set("header_for_layout", "Sample Application"); $this->set("footer_for_layout", "copyright by SYODA-Tuyano. 2011."); // post時の処理 //$this->set('Mac554FoodDatas',$this->Mac554FoodData->find('all')); } public function index() { $this->layout = "plain"; $this->set("header_for_layout", "Sample Application"); $this->set("footer_for_layout", "copyright by SYODA-Tuyano. 2011."); //レイアウト } } ?> で、検索フォームはエレメントで <?php echo $this->Form->create('Mac554FoodData', array('url' => '/Mac554FoodDatas/find'))?> <fieldset> <legend>Search or Die!</legend> <dl> <dt><label>ユーザname</label></dt> <dd><?php echo $this->Form->input('name', array( 'type' => 'text', 'div' => false, 'label' => false))?></dd> <dt><label>time</label></dt> <dd><?php echo $this->Form->input('time', array( 'type' => 'text', 'div' => false, 'label' => false ))?></dd> <dt><label>naiyoudao</label></dt> <dd><?php echo $this->Form->input('naiyoudao', array( 'type' => 'text', 'div' => false, 'label' => false ))?></dd> </dl> <?php echo $this->Form->submit('検索',array('div'=>false,'escape'=>false))?> </fieldset> <?php echo $this->Form->end()?> のように作りました。 モデルは、 <?php class Mac554FoodDatas extends AppModel{ public $name=Mac554FoodData public $actsAs = array('Search.Searchable'); // 検索対象のフィルタ設定 public $filterArgs = array( array('name' => 'name', 'type' => 'value', 'field' => 'Mac554FoodData.name'), array('name' => 'time', 'type' => 'like', 'field' => 'Mac554FoodData.time'), array('name' => 'naiyoudao', 'type' => 'like', 'field' => 'Mac554FoodData.naiyoudao'), ); //検索対象のフィールド設定 public $presetVars = array( array('field' => 'name', 'type' => 'value'), array('field' => 'time', 'type' => 'value'), array('field' => 'naiyoudao', 'type' => 'value'), ); } という感じで作りました。 投げているSQL文を見ると、 SELECT `Mac554FoodData`.`id`, `Mac554FoodData`.`time`, `Mac554FoodData`.`name`, `Mac554FoodData`.`naiyoudao`, `Mac554FoodData`.`twinoid` FROM `mac554_foodlog`.`mac554_food_datas` AS `Mac554FoodData` WHERE 1 = 1 となっています。 よろしくお願い致します

    • ベストアンサー
    • PHP
  • プルダウンとphp+mysqlに関して

    初心者です。教えてください。現在、mysqlのAというテーブルlから持ってきたデータをプルダウンで表示させて、選択したものをmysqlの別テーブルに入力するプログラムをphpで作成しています。ただ、mysqlでAというテーブルからデータは取れているようですが、うまく表示されません。教えていただけるでしょうか? 下記のソースになります。うまくいっていない部分にコメントしています。 <?php //設定 require_once('config.php'); require_once('function.php'); connectDb(); @mysql_query('SET NAMES utf8'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> <body> <h1>作成</h1> <form action= "kakunin.php" METHOD="post"> <p>日時:<input type="datetime" name="nitizi"></p> <p>年:<input type="text" maxlength="4" name="toshi"></p> <p><label>項目:<textarea name="question" cols="100" ></textarea></label></p> -----------------ここからがうまくいっていません。--------------- <p><label>分類</label> <?php $rs = mysql_query("SELECT * FROM bunrui_table"); $row = mysql_fetch_array($rs); if(!$rs){ die('取得できませんでした'.mysql_error()); } print '<SELECT NAME="mb">'; while($row=mysql_fetch_array($rs)){ print('<p>'); print("<option value=".$row['b_id'].">"); print("</option>"); print('</p>'); } print '</SELECT>'; ?> ーーーーーーーーーーーーーーーーーーーーーーここまでーーーーーーーーーー </p> <p>A <input name="n_a" type="text" size="50"></p> <p>B <input name="n_b" type="text" size="50"></p> <p>C <input name="n_c" type="text" size="50"></p> <p>D <input name="n_d" type="text" size="50"></p> <p> <label for="s">hantei</label> <select name="s" > <option value="1">A</option> <option value="2" >B</option> <option value="3">C</option> <option value="4">D</option> </select> </p> <label>解説<textarea name="k" cols="100" ></textarea> <br></label> <br> <input type="submit" value = "入力"> <input type="reset" value="reset"> </form> </body> </html>

    • ベストアンサー
    • PHP
  • jqueryでXML内テキストをオブジェクトに

    XML内のテキストをオブジェクトのコンストラクタの引数に渡すことはできますか? 例:(これではできませんでした。) -------------------------------------------------------------- ffdata.xml <?xml version="1.0" encoding="UTF-8" ?> <ffdata> <chardef><!--キャラ登場時のステ(name,hp,mp,str,fig,tec,agi,int,mnd)--> <ch1>アラゴルン,400,80,10,7,8,10,6,6</ch1> </chardef> </ffdata> -------------------------------------------------------------- main.html <script> //************************************************オブジェクト function charctor(name,hp,mp,str,fig,tec,agi,int,mnd){ this.name= name; this.hp = hp; this.mp = mp; this.str = str; this.fig = fig; this.tec = tec; this.agi = agi; this.int = int; this.mnd = mnd; } //************************************************ffdata.xmlファイルを読み込み $(document).ready(function(){ $.ajax({ type: "GET", url: "ffdata.xml", dataType: "xml", success: function(xml) { createObj(xml);}, error: function(){alert("xmlファイルの読み込みに失敗しました");} }); }); //************************************************オブジェクト作成 function createObj(xml){ aragorn = new charctor($(xml).find("chardef").find("ch1").text()); $("#main").html(aragorn.str);//************************#main内に表示 } </script> <body id="main"> </body> ------------------------------------------------------------- 思いつきでやってうまく行かなかったんですが、何か出来そうな気がするんです。 間違いがあったら指摘していたけると助かります。

  • Perl初心者です。MySQLから取得したデータをXMLで出力させたいです。

    以下のようにしましたがXMLのエンコードを euc-jp にするときちんと表示されますが、utf-8 にするとダメです。 助言をお願いします。cgiファイルとDB(MySQL)の文字コードはEUC-JP、Perlのバージョンは5.6です。 #!/usr/local/bin/perl use DBI; use Jcode; $sqlStr = "SELECT * FROM Test"; $x = "Content-type: text/xml; charset =utf-8\n\n"; # utf-8 $x .= "<\?xml version=\"1.0\" encoding=\"utf-8\"\?>\n\n"; # utf-8 $x .= "<ROOT>"; $dbh = DBI->connect ("DBI:mysql: AAA: localhost","BBB","CCC "); $sth = $dbh->prepare("$sqlStr"); $sth->execute; $num_rows = $sth->rows; $num_fields = $sth->{NUM_OF_FIELDS}; for ($i=0; $i<$num_rows; $i++) { $x .= "<ROW>"; @a = $sth->fetchrow_array; for ($n=0; $n<$num_fields; $n++) { $a[$n] =~ s/&/&amp;/g; $a[$n] =~ s/</&lt;/g; $a[$n] =~ s/>/&gt;/g; $col = $sth->{NAME}->[$n]; $x .= "<$col>$a[$n]</$col>"; } $x .= "</ROW>"; } $sth->finish; $dbh->disconnect; $x .= "</ROOT>"; Jcode::convert(\$x,'euc','utf8'); # utf-8 print $x; exit;

    • ベストアンサー
    • Perl
  • WHERE句で一致しない場合を判断させる方法

    下記のようなコードで$mysql_Codeで一致しない場合は、 $html_Code .= '<tr><td colspan="4">条件に一致する項目はありません。</td></tr>'; をさせたいと考えているのですが思うようにいきません。 $mysql_Code = "SELECT * FROM infotable WHERE name='$kisetsu' AND kudamono='$kudamono'"; mysql_set_charset('utf8'); $mysql_Row = mysql_query($mysql_Code,$mysql); $html_Code = ""; if(!mysql_fetch_array($mysql_Row)){ $html_Code .= '<tr><td colspan="4">条件に一致する項目はありません。</td></tr>'; } while($row = mysql_fetch_array($mysql_Row)){ $id = $row["id"]; $name = $row["name"]; $kudamono = $row["kudamono"]; $coment = nl2br($row["coment"]); $html_Code .= "<tr><td>$id</td><td>$name</td><td>$kudamono</td><td>$coment</tr>\n"; } といったやり方でやると、一致するはずの一部のフィールドが表示されなかったりします。 $mysql_Codeで一致するフィールドが見つかったかどうかを !mysql_fetch_array($mysql_Row) で判断させているのですが、これはダメなのでしょうか。 そういう場合はどのようにするのがいいのでしょうか。

    • ベストアンサー
    • PHP
  • 連想配列、オブジェクト配列の使い分け

    お世話になります。 データベースで結果を取得する場合など、連想配列のままではなく何故、わざわざオブジェクトに格納する様な手法が使われるのでしょうか? 連想配列のままで処理するほうが早いと思いますし、それに付随するクラスファイルも多くなります。また、「結びつきを緩くして仕様変更に耐えうる様に」など聞きますが、余計複雑になってしまう様な気がしますので、メリットが今ひとつ分からず判断に迷ってしまいます。 どの様な使い分け、考え方をすれば良いかアドバイスいただけたら幸いです。 何卒、宜しくお願いします。 例) ※必要と思われる部分のみ記述しております。 ■連想配列 while($row=mysql_fetch_assoc($res)){ ~以下必要な処理} ■オブジェクト配列 while($row=mysql_fetch_assoc($res)){ $example = new Example(); $example->setName($row['name']); $example->setAddr($row['addr']); $array[] = $example } ~以下必要な処理 ○モデル class Example { private $_name = null; private $_addr = null; public function __construct() {} public function setName($name) { $this->_name = (string) $name; return $this; } public function getName() { return $this->_name; } public function setAddr($addr) { $this->_addr = (string) $addr; } ~以下省略 }

    • ベストアンサー
    • PHP

専門家に質問してみよう