xml取得値を文字列と比較

このQ&Aのポイント
  • オブジェクト型と文字列の比較で困っている
  • XMLの特定の要素と文字列を比較する方法がわからない
  • PHPでxpathを使ってxml取得値を配列に書き出したい
回答を見る
  • ベストアンサー

xml取得値を文字列と比較

いつもお世話になっております。 オブジェクト型(object)と文字列(string)の比較がうまくいかずに 困っている次第です。 ご教授願えないでしょうか。 一度質問後閉じたのですが、うまくいかず再度質問させて下さい。 [sample.xml} <item> <data0> <cd>00001</cd> <nm>yahoo</nm> </data0> <data1> <cd>00002</cd> <nm>google</nm> </data1> <data2> <cd>00003</cd> <nm>google_1</nm> </data2> <data3> <cd>00004</cd> <nm>google_2</nm> </data3> [php] $cd = '00003' $filename = sample.xml $j = 0; if($xml = simplexml_load_file($file_name)){ $cnt = count($xml); for($i=0; $i<$cnt; $i++){ $data = 'data' .$i; if($cd !== $xml->xpath($data .'/cd')){ $data[$j++] = $xml->$data->nm; } } } 上記とした際、$nm != $xml->$data->nm が有効な比較となりません。 php の cdのみを配列に書き出したいです。 $xml->xpath($data .'/cd')でDisplayしてみると。 arrayとしか表記されません。 色々調べたりしたのですが、 お手数ですが、教えて下さい。

  • prr4e
  • お礼率48% (66/136)
  • PHP
  • 回答数3
  • ありがとう数0

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

ちょっと読み取れているかどうか自信がありませんが、やりたいのはこういうことでしょうか? <?php $cd = '00003'; $filename = 'sample.xml'; if($xml = simplexml_load_file($filename)){ $data = array(); $cnt = count($xml); for($i=0; $i<$cnt; $i++){ $dno = 'data' . $i; if($xml->$dno->cd[0] != $cd){ $data[] = $xml->$dno->nm[0]; } } print '<pre>'; var_dump($data); print '</pre>'; }

prr4e
質問者

補足

返答有難う御座いました。 なぜか以前に試した、 $cd !== strval($xml->$dno->nm)でうまく行きました。 折角回答頂いたのにすみません。 因みに print_r($xml->$dno->nm)をすると、 SimpleXMLElement Object ( [0] => 0003 ) で出力されるので、$xml->$dno->cd[0]で指定するんですよね。 $xml->$dno->nm と $xml->$dno->nm[0] の比較の違いはなんなんでしょう。 ご存知でしたら教えて頂けないでしょうか。

その他の回答 (2)

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.3

simplexml って確か文字列にキャストしてくれたよな、、、と思って調べてみると案の定、何の問題も無く、文字列にキャストできる。 もう一度、strval などでキャストしてみてはいかがだろうか。 XPathを利用するなら仕様を一度は目を通されてはいかがだろうか。 /cd とした場合ルートの下の QName cd の要素を探しにいく。件のXMLにはルート配下に cd が無いため空の配列を返す。 要素 cd が必要な場合、やや乱暴になるが //cd 又はパスを通して /item/*[starts-with(local-name(),"data")]/cd 前者はすべての階層に属する cd を探すため厳密ではない。かといって後者も data で始まる子要素を探しているに過ぎないため、こちらも厳密ではない。 data0 や data1 は何を抽象化しているのかわからない。やるなら、data で抽象化し、属性値で連番を持たせてやればいい。

prr4e
質問者

補足

返答有難う御座いました。 なぜか以前に試した、 $cd !== strval($xml->$dno->nm)でうまく行きました。 折角回答頂いたのにすみません。 >data0 や data1 は何を抽象化しているのかわからない。やるなら、data で抽>象化し、属性値で連番を持たせてやればいい。 こちらは汎用的にdata0,data1,data2と、順番を判定する為にもっています。 勉強不足で、/item/*[starts-with(local-name(),"data")]/cd を理解できていませんが、"data"を変数化する場合はどのようにしたら宜しいのでしょうか。 お手数ですが、ご教授願えないでしょうか。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

> arrayとしか表記されません。 array としか出ないなら、print_r してみるといいと思いますよ。 と、投げやりな回答をしてみる。 その「arrayとしか表記されない」件に関して、ちゃんと説明すると、「array」って表示されるのは、「その変数は配列ですよ」って事か、そのまんま「array って 文字列が入ってる」って事のどっちかです。 文字列かどうかは is_array すりゃ分りますが。

prr4e
質問者

補足

返答有難う御座いました。 var_dumpやprint_rなどはして実行してみたのですが、 echo分で単体で表示されないから、 全て比較がfalseとなり、全件表示されている事は 知っていたのですが、 色々アドバイスを受けながら何とかできました。 有難う御座いました。

関連するQ&A

  • オブジェクトと文字列の比較

    いつもお世話になっております。 オブジェクト型(object)と文字列(string)の比較がうまくいかずに 困っている次第です。 ご教授願えないでしょうか。 [sample.xml} <item> <data0> <cd>00001</cd> <nm>yahoo</nm> </data0> <data1> <cd>00002</cd> <nm>google</nm> </data1> [php] $nm = 'google' $filename = sample.xml $j = 0; if($xml = simplexml_load_file($file_name)){ $cnt = count($xml); for($i=0; $i<$cnt; $i++){ $data = 'data' .$i; if($nm != $xml->$data->nm){ $data[$j++] = $xml->$data->nm; } } } 上記とした際、$nm != $xml->$data->nm が有効な比較となりません。 gettypeで調べたら、$nmはstring $xml->$data->nmはobjectとなっていたので、 オブジェクトをstrvalで変換をしてみたのですが変わらず。 どうにか比較できるようにしたいのですが、 お手数ですが、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • XMLタグ情報取得

    PHPにxmlファイルのタグ情報を利用するシステムを構築したいのですが、調べてもよく解らなかったため質問させて頂きます。 PHPは勉強経験があるため解るのですがXMLはまったくの初心者です。 システムは以下の流れです。 システムA(PHP) <?php  $i;  if($iがシステムBで使用されているか確認){   使用されている場合$iで処理  }else{   使用されていない場合xmlファイルからタグ情報取得   for($iの親タグ<B>を取得){    if(<$i><$j><$k>のどれかがシステムBで使用されていないか?){     $jが使用されていた場合、システムAの$iと、システムBの$jは同じ使用用途のデータと判断し処理    }   }  } xmlファイル <?xml version="1.0" encoding="EUC-JP"?> <A> <B> <$i></$i><$j></$j><$k></$k> </B> </A> このようなシステムを構築したいのでご教授お願いします。 違うシステム同士でデータを利用する際、同じ使用用途でもシステムによって名称が異なる場合にも対応できるシステムを課題としています。 また、DOM方式を利用した方法だと助かります。 環境はXP、PHP5、Apache2.0です

    • ベストアンサー
    • PHP
  • PHPでの文字列の扱い

    以下のPHPを書きましたが if文の$aに期待する値が入りません。この場合はどのようにすればよいのでしょうか? $a = "\$item[2] == \"1\" || \$item[2] == \"4\""; $Data = file("data.csv"); for($i = 0; $i < sizeof($Data); $i++){ $item = explode(",", $Data[$i]); if($a){ include('list.php'); } }

    • 締切済み
    • PHP
  • 文字列の比較について

    BufferedReaderでファイルを読んだのちに、見出しの文字列をカンマで分割して 文字列を比較しようとしています。 ですが、分割すると、文字列が別な文字コードによる表記に変わってしまいます。 なぜでしょうか? また、解決方法などのヒントなどあれば教えてください。 BufferedReader buffReader = new BufferedReader( new FileReader("/home/masa/Desktop/Sample.csv")); String s; int ini=0; int wamei=0; int i=0; while((s = buffReader.readLine())!= null){ String[] str = s.split(",", -1); //System.out.println(s); if (i == 0) { for(int j=0; j<str.length;j++){ System.out.println(String.toString(str)); if(str.equals("五十音")){ini = j;} System.out.println("五十音"+ini); if(str.equals("a")){wamei = j;} System.out.println("和名"+wamei); //System.out.println(j); } } i++;

    • ベストアンサー
    • Java
  • 高速に文字列の比較

    高速に文字列の比較 open(IN,"$file"); while (<IN>) { my($ip,$flag) = split(/,/,$_); if($flag==1){$data .= "$ip,";} } close(IN); open(IN,"$file2"); while (<IN>) { my($ip,$x,$z) = split(/,/,$_); foreach ( split(/,/, $data) ) { if ($ip eq $_) {$xdata.= "$ip,$x,$z\n";} } close(IN); 1.$fileで、$flagが1なら$ipを変数$dataに加えます。 2.$file2の$ipが、$dataの$ipに含まれていれば,$file2のデーターを$xdataに加えます。 上記の書き方で一応比較は出来ているようなのですが、perlの知識があまりない素人が適当に考えた書き方なので、自信がありません。 $data .= "$ip,";の$ipの後ろに,を入れている部分も何だか変なのですが、他の書き方が思いつけません。 書き方が間違っている場合や、こうすればもっと高速に動作させられるという書き方があれば、ご指導いただけると幸いです。 $fileも$file2も、100万行あたりまで増える見込みなので、出来るだけサーバーに負荷のかからない書き方ができればと思っています。 お手数ですが、どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 文字列の比較がうまくいきません。

    $j = M; #"M"にしてもかわりませんでした。 $a = $line[5]; #CSVからの読み込みデータです。Mが格納されています。 ここで if($j == $a){ 内容 } とすると比較が偽となり「内容」が表示されません。演算子を!=としたら「内容」が表示されます。 ためしにifの前に print "$j"; print "$a"; としてみるとMMと表示されるといった感じです。 すみませんが助言をお願いいたします。

    • ベストアンサー
    • PHP
  • XML::XPathでのfor文の記述

    たびたびお世話になります。よろしくお願いいたします。 perlでXML文書をHTMLへ変換しています。 ---------------------------------------- <!-- file.xml --> <root> <jouhou> <mei> <toushu>あ</toushu> <toushu>い</toushu> <toushu>う</toushu> </mei> <mei> <toushu>え</toushu> <toushu>お</toushu> <toushu>か</toushu> </mei> </jouhou> </root> ---------------------------------------- このようなXMLの場合に、XML::XPathで「あ」と「え」などの最初に来る<toushu>取りたいのですが 日によって<mei>の数が異なるため、<mei>の数を取得してその数でforをすることにしました。 が、うまくいきません。 my $xp = new XML::XPath( filename => "./file.xml" ); for(my $j=1;$j<=$xp->findvalue("count(//jouhou/mei/toushu)");$j++){ print $j; #←ここでは1と2が出ます。 print $xpath->find('//jouhou/mei[$j]/toushu')->get_node(1)->string_value; } このままでは全く出なく、["$j"]とすると、出るには出るのですが「あ」が2回出てしまいます。 書き方が違うと思うのですが、()でくくってみても出ません。 ちなみに print $xpath->find('//jouhou/mei[1]/toushu')->get_node($j)->string_value; だと、ちゃんと「あ」と「い」が出ました…。 もし、お分かりになれば教えていただきたいです。 お手数をおかけしますが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • PHPでXMLを扱いたいのですが

    PHPでXMLを扱いたいのですが、わからないところがあります。 <XML>  <T>   <A>    <a>    </a>    <b>    </b>    <c>     <c1></c1>     <c2></c2>    </c>   </A>   <A>    <a>    </a>    <b>    </b>    <c>     <c1></c1>     <c2></c2>    </c>   </A>   <A> 以下くりかし・・・  </T> </XML> このような感じのXMLがある時に、<a>,<b>等のタグの中身はちゃんと一つめの<A>、二つめの<A>、のように、 繰り返しある全てを取り出すことが来るのですが、 <c1>のようにもう一つ奥になっているものが取り出せません。 //以下成功するソースです。 foreach(XML->T->A as $value){ $data[]=$value->a; } for($i=0,$n=count($data);$i<$n;$i++){ $file=$data[$i]; } echo $file; これだとうまく動作しますが、 //以下失敗するソースです。 foreach(XML->T->A->c as $value){ $data[]=$value->c1; } for($i=0,$n=count($data);$i<$n;$i++){ $file=$data[$i]; } echo $file; このように<c1>を取り出そうとすると、繰り返しある<c1>の内の初めの一つしか取りだせません。 もう何回も色々と変えてやっているのですが、どれもうまくいきませんでした。 どうすればいいのでしょうか。分かる方教えて下さい、お願いします。

    • 締切済み
    • PHP
  • 文字列(配列)を変数として使いたい

    PHPいつまでたっても初心者の者ですm(__)m 以下のようなことをしたいのですが、方法がわかりません。 ------- $code01[1] = "000"; $code02[1] = "020"; $code03[1] = "030"; $code01[2] = "001"; $code02[2] = "021"; $code03[2] = "031"; for ($i=1; $i<=2; $i++) { while ($cnt <= 3) { $cnt = $cnt + 1; if (strlen($empcnt) == 1) { $cnt2 = "0".$cnt; } else { $cnt2 = $cnt; } $codes = "code".$cnt2."[".$i."]"; <--- こんな感じのことがしたいのですが echo $$codes; <--- これだとうまくいかない } } ------- 期待する結果 000 020 030 001 021 031 ------- 出力方法が知りたいです。 よろしくお願いしますm(__)m

    • ベストアンサー
    • PHP
  • PHPで作ったカウンタを任意の位置における

    ようにしたいのですができません counter.php: <?php $data_file = './access.dat'; //データファイル $fp = fopen("$data_file", "r+"); $cnt_num=(string)(fgets($fp, 64)+1); fseek($fp,0); flock($fp,2); fwrite($fp,$cnt_num); fclose($fp); $cnt_num=sprintf("%06d",$cnt_num); $f_pass = './a_gif'; for($i=0;$i<strlen($cnt_num);$i++)$value[]=substr($cnt_num,$i,1); for($j=0;$j<count($value);$j++)echo "<img src=$f_pass/".$value[$j].".gif>"; ?> としてHTMLの任意位置で <img src="./counter.php"/> をおいたのですが×マークが出るだけでカウンタ値が表示されません どうしたらいいでしょうか

    • ベストアンサー
    • CGI