phpを使ってxmlの追加書き出しについて教えてください

このQ&Aのポイント
  • phpを使用してxmlに追加書き出しを行いたい場合、fopen関数を使ってファイルを追記モードで開くことができますが、同じXMLヘッダが二重に作成されてエラーが発生します。この問題を解決する方法はありますか?
  • 現在、flashからphpにデータを渡し、phpでXMLを作成していますが、この方法では1つのXMLデータしか作成できません。xml_write関数を使用してファイルを書き出すと、XMLヘッダが二重に書き込まれてしまいます。どのようにすれば問題を解決できますか?
  • PHPを使用してXMLに追加で書き出す方法について教えてください。具体的には、fopen関数を使用してファイルを追記モードで開こうとすると、同じXMLヘッダが二重に作成されてしまい、エラーが発生します。解決策はありますか?
回答を見る
  • ベストアンサー

phpを使ってxmlの追加書き出しについて教えてください

現在flashからphpに位を渡して、そこからxmlで書き出すということをしています。 phpからxmlを作成することは、なんとか無事にできるのですが、この場合一つのXMLデータしか作成できません。 fopen($fname."a")を使って追加で作成しようとすると $buf ="<?xml version=\"1.0\" encoding=\"" . $encode."\" ?> \r\n"; が二重に作成されてエラーが出ます。なにか解決策はないでしょうか? お願いします。 ソース ------------------------------------------------------------ <? function xml_write($fname,$roottag,$id,$encode,$val) { $file = fopen($fname,"w"); // XMLヘッダ書き出し // $buf ="<?xml version=\"1.0\" encoding=\"" . $encode."\" ?> \r\n"; fputs($file,$buf); // XMLルート書き出し // fputs($file,"<".$roottag.">\r\n"); // XMLルート書き出し1 // fputs($file,"<".$id.">\r\n"); // XML本文書き出し // foreach($val as $key => $oneval) { fputs($file,"<".$key.">" . $oneval . "</".$key.">\r\n"); } // XMLルート書き出し1 // fputs($file,"</".$id.">\r\n"); // XMLルート終了 // fputs($file,"</".$roottag.">\r\n"); fclose($file); } xml_write("./test/test.xml","doc","object","Shift_JIS",$_POST); ?> -----------------------------------------------------------------

  • ziru
  • お礼率2% (2/83)
  • PHP
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

せっかくXMLを扱うためのAPIが用意されているのですから、そちらを使ってみてはいかがですか?

関連するQ&A

  • xmlファイル(UTF-8)への書き出し時の改行

    こんばんわ。 息詰ってしまったので質問をさせていただきます。 無理矢理な書き方をしているのがいけないのか PHPからXMLファイルへ書き出しをすると改行として認識されず文字として認識されてしまいます。 どのたかご存じの方がいましたらアドバイスをお願いします! ■index.php(UTF-8、LF) //書き出しに関してのスクリプトです。 $xmlfile="xml/samplexml.xml(xmlファイルまでのパスとxmlファイル名)"; //xmlに書き出しデータ作成 $xmldata = "<xmldata><データ>データだよ</データ><果物>いちご</果物><野菜>キュウリ</野菜></xmldata>"; $fp = @fopen($xmlfile , "a") or err_msg("XMLが開けません。"); flock($fp , LOCK_EX); fputs($fp , $xmldata . "\n"); flock($fp , LOCK_UN); fclose($fp); ■samplexml.xml(UTF-8、LF) <?xml version="1.0" encoding="UTF-8"?> <xmldata><データ>データだよ0</データ><果物>ばなな</果物><野菜>キャベツ</野菜></xmldata> ※ここに改行をさせてデータを追加したい。。 上のスクリプトの結果は改行されずに「\n」も文字として改行されずに追加されてしまう。(「\n\r」「\r」でもテストをしてみたのですが結果は同じでした。)

    • ベストアンサー
    • PHP
  • phpのエラー(Warning: explode() [functio

    phpのエラー(Warning: explode() [function.explode]: Empty delimiter in..)と(Warning: Invalid argument supplied for foreach() in) PHP4のサーバーにて問題なく作動しているプログラムなのですが、PHP5のサーバーにて設置したところ、以上のエラー表示がされ、解決策が見つからず質問いたしました。 エラーの出たサーバー情報 PHP Version 5.2.11 Server API Apache エラーの出たファイル1 --------------------- $fname = "als_admin/alslist.dat"; $fp = fopen($fname, "r"); $buf = fread($fp, filesize($fname)); $buf = explode( LB(), substr($buf, 0, strlen($buf)-strlen(LB()) ) );    ※ //tab毎に分割 foreach($buf as $key => $value) { //表示対象を抽出   ※ $buf[$key] = explode("\t", $value); } //詳細情報に代入 $write = ""; foreach($buf as $key => $value)     ※ { //idが一致するデータのみを取得 if( $value[0] != $_GET['id'] ){ continue; } //非表示中はアクセス不可(一覧には出ないが直リン対策) if( $value[13] < 0 ){ //リストNoがマイナスになっている exit("ページが存在しません。<a href=\"top.php\"> TOPへ</a>"); } //データをセット foreach($gkey as $fk => $fv){ $g[$fv] = $value[$fk] ? $value[$fk] : ""; } break; } エラーの出たファイル2 --------------------- <? include "../modules.php"; if(empty($_GET['r'])) : //リスト表示の場合 $fname = "galslist.dat"; $buf = file_get_contents($fname); if(!empty($buf)) { $buf = explode( LB(), substr( $buf, 0, strlen($buf) - strlen(LB()) ) ); ※ foreach($buf as $key => $value) {     ※ $buf[$key] = explode("\t", $value); if(isset($buf[$key][13]) && $buf[$key][13] > 0) $view[] = $buf[$key]; else $noview[] = $buf[$key]; } } endif; ?> エラー表示が出たところに※印をいれました。 文字数制限があり、お答えを頂く上で以上の記載で足らない部分がありましたらご指摘頂けますでしょうか。恐れ入りますがよろしくお願いします。

    • ベストアンサー
    • PHP
  • php4でのxml上書き

    はじめまして、phpでxmlの上書きをしたいのですが、 phpは <?php $xml_path = "gundam.xml"; $xml = file_get_contents( $xml_path ); $replace_key = "</robot>"; $add_xml = "<gundam>\n<pilot>シーブック</pilot>\n<mobilesuits>ガンダムF91</mobilesuits>\n</gundam>\n".$replace_key; $result = str_replace($replace_key,$add_xml,$xml); $fp = fopen($xml_path,"w+"); flock($fp, LOCK_EX); fwrite($fp,$result); fclose($fp); ?> xmlは <?xml version="1.0" encoding="Shift_JIS"?> <robot> <gundam> <pilot>アムロ</pilot> <mobilesuits>ガンダム</mobilesuits> </gundam> <gundam> <pilot>カミーユ</pilot> <mobilesuits>Zガンダム</mobilesuits> </gundam> <gundam> <pilot>ジュドー</pilot> <mobilesuits>ガンダムZZ</mobilesuits> </gundam> <gundam> <pilot>コウ</pilot> <mobilesuits>ガンダムGP01</mobilesuits> </gundam> <gundam> <pilot>クリス</pilot> <mobilesuits>ガンダムアレックス</mobilesuits> </gundam> </robot> と書いてあります。 最後にxmlを書き換えた部分を $fp = fopen($xml_path,"w+"); flock($fp, LOCK_EX); fwrite($fp,$result); fclose($fp); で上書きしたいのですができません。 何が問題なのでしょうか?

    • ベストアンサー
    • PHP
  • どうやってフローチャートを書きますか

    #include<stdio.h>   void main()   {   FILE*fp;   char buf[128];   char *rc;   char fname[20];   do{   printf("file name>>>");   scanf("%s",fname);   fp=fopen(fname,"r");   if=(fp==NULL) printf("File Open Err¥n");   }while(fp==NULL);   rc=fgets(buf,128,fp);   while(rc!=NULL){    printf("%s",buf);    rc=fgets(buf,123,fp);    }    fclose(fp);    }

  • 44行目: パラメータ '__format' は const signed char * 型として定義されているので int は渡せない(関数 main )

    ☆--------------ソース--------------☆ #include <stdio.h> struct seiseki { int no; char fname[20]; char lname[20]; int val[3]; }seito; int main(void) { int i,total; FILE *fp; FILE *file; struct seiseki seito[20]; char buf[1024]; fp = fopen("in.txt", "r"); i=0; while( fgets(buf, sizeof(buf), fp) ){ struct seiseki tmp; sscanf(buf,"%d %s %s %d %d %d",&tmp.no,tmp.lname,tmp.fname,&tmp.val[0],&tmp.val[1],&tmp.val[2]); seito[i++] = tmp; } printf("ID / NAME / 数(1) / 数(2) / 数(3) \n"); for(i = 0; i < 3; i++) { printf("%d / %s %s / %d / %d / %d\n", seito[i].no,seito[i].lname,seito[i].fname, seito[i].val[0], seito[i].val[1], seito[i].val[2]); } file = fopen("output.html","w"); fprintf(file ,"<HTML><HEAD></HEAD><BODY><table border=1 bodercolor=black cellspacing=0 width=700>\n"); fprintf(file ,"<tr bgcolor=#FF7575><td>ID</td><td>氏名</td><td>数(1)</td><td>数(2)</td><td>数(3)</td><td>合計点</td><td>平均点</td><td>偏差値</td><td>順位</td></tr>\n"); for(i = 0; i < 3; i++) { fprintf(file ,seito[i].lname); fprintf(file ,seito[i].fname); ☆省略☆ fprintf(file ,seito[i].val[0]); ☆省略☆ } fprintf(file ,"\n</table></BODY></HTML>\n"); return 0; }

  • PHPから書き換え

    尻取りゲーム用に書いたPHPスクリプトの一部ですが CGIに書き換える方法がよくわかりません。 教えていただけませんでしょうか。 ============================================ if(isset($_POST['shiritori'])){ $rest = mb_substr($shiritori, -1, 1, "SJIS"); $hajime = mb_substr($shiritori, 0, 1, "SJIS"); if(($name != "") && ($shiritori != "")){ if($hajime == $key){ setcookie("name", $name, $expire); $key = file($keyfile); $fp = fopen($keyfile, "w"); fputs($fp,$rest); fclose ($fp); $word = "".$shiritori."<hr>"; $lines = file($logfile); $fp = fopen($logfile, "w"); fputs($fp,$word); for($i = 0; $i < $logmax-1; $i++) fputs($fp, $lines[$i]); fclose ($fp); } } else{ print"記入漏れはありませんか<br>"; print"次は<b>" .$key. "</b>から始まる語です。<br>"; } ============================================ どうぞよろしくお願いします。

    • 締切済み
    • CGI
  • php4、php5によるimplode()、file()の動作の違い?

    お世話になります。 SJISのファイルで、 //----コメント //あああ //--------------- あああ,いいいいいいいいいいいいい ううううう,えええええええええええええ のようなファイルを作成して $csv へこSJISファイルのファイルパスを設定し、 $FielList = mb_convert_encoding(@implode('', @file($csv,FILE_SKIP_EMPTY_LINES)), "UTF-8", "SJIS"); $RowData = split("\r\n",$FielList); foreach($RowData as $Value) { $FName=trim($FName);$Cmnt=trim($Cmnt); echo '$FName='.$FName.'<br> $Cmnt='.$Cmnt.'<br>'; } と、その内容を見ると php5では、 $FName=//あああ $FName=//--------------- $FName=あああ $Cmnt=いいいいいいいいいいいいい $FName=ううううう $Cmnt=えええええええええええええ と、想定の結果が得られます。 しかし、php4だと、 $FName=//あああ//--------------- となってしまい、どうもcsvファイルの内容が\r\nにより仕切られて配列とならないようです。 そこで、 $FielList = mb_convert_encoding(@implode('###', @file($csv,FILE_SKIP_EMPTY_LINES)), "UTF-8", "SJIS"); $RowData = split("###",$FielList); とすれば、php4,php5でも動作します。 また、 $FielList = mb_convert_encoding(@implode('', @file($csv,FILE_SKIP_EMPTY_LINES)), "UTF-8", "SJIS"); $RowData = split("\n",$FielList); とすると、php4で予想の結果が返されますが、 php5では、echo で何も表示されなくなります。 ません。 php4、php5による \r\nの扱いの違い implode()の動作の違い file()の動作の違い だと思うのですが、どのように違うのかがわかりません。 このあたりのことをおわかりの方、 implode('###',@file(・・・ ) と記述しなくても implode('',@file(・・・ ) と記述することによりphp4、php5で同じように動作する方法がわからないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phpで二重書込みできないプログラムを作りたい

    PHP初心者です。 テキストファイルに、ある文字列を書き込むプログラムを作ろうとしています。 ファイル内容に同じ文字列があれば書き込まず、 同じ文字列が無ければファイルに書き込むという プログラムを作りたいのですが、 うまくいきません。 どなたかアドバイスをお願いします。 <?php $name = "文字列"; $fp = @fopen("file.txt", "r"); $contents = @file_get_contents($fp); if(ereg($name, $contents)) { print "登録済みです。" ; } else { $fpa = @fopen("file.txt", "a"); fputs($fpa, "$name\n"); fclose($fpa); print "登録しました。"; } fclose($fp); ?>

    • 締切済み
    • PHP
  • php初心者の質問fgetcsv

    いつもお世話になっております。 下記のプログラムを実行しますと、 999,test,90, 999,test,90, 999,test,90, のようになりますが、 行末の最後のカンマを取り除きたいです。 すみません。どの部分修正すればよいか、ご教授いただきたくどうぞよろしくお願い致します。 <?php $file_name="test.csv"; $id=999; $name="test"; $point=90; $array = compact("id","name","point"); $string = implode(",",$array); $file = fopen($file_name,"a+") or die("OPENエラー{$file_name}"); flock($file,LOCK_EX); fputs($file,mb_convert_encoding($string."\n",'Shift-JIS','UTF-8')); flock($file,LOCK_UN); fclose($file); $file = fopen($file_name,"r"); while ($row = fgetcsv($file,1000,",")){ echo "<hr>"; for ($i = 0 ; $i<count($row); $i++){ echo mb_convert_encoding($row[$i].",",'UTF-8','Shift-JIS'); } } fclose($file); ?>

    • ベストアンサー
    • PHP
  • fopenの書き出しでファイル作成できません。

    Microsoft Visual C++ 2010を使ってC言語の勉強をしております。 大変初歩的な内容で申し訳ないのですが、 fopenで操作モードを「書き出し」としたときにファイルが存在しない場合、新たにファイルが作成されるという認識で正しいでしょうか。 しかし、実際にプログラムを作成するとエラーが発生してしまうので、困っております。 もし役立つのであれば、ソースをご覧ください。 ――――――――――――― #include <stdio.h> #include <stdlib.h> int main(void) { int i; double x, y; char fname[20]; FILE *fp; printf("input filename : "); scanf_s("%s", fname); fp = fopen(fname, "w"); … ――――――――――――― 自分の間違いをご指摘いただけるとありがたいです。 どうかよろしくお願いいたします。

専門家に質問してみよう