2016-10-31 12 views
0

XMLテンプレートを読み込み、テンプレート内の一部の値をPHPの配列のデータに置き換えるPHPコードを作成しています。現在、コードが実行されると、ループの各反復ごとにファイルが出力され、それぞれ正しい値が置き換えられます。反復ごとにPHPを作成するのではなく、同じXMLドキュメントにPHPを書き込む

私が直面している問題は、各出力を1つではなく同じXMLドキュメントにまとめることです。以下は現在のコードです。

<? 

$filename = 'MYDRIVE\XML_TEMPLATE2.xml'; 
$contents = file_get_contents($filename); 

$emaillist = array(array('fname'   => 'Brad', 
         'lname'   => 'BoBo', 
         'recipient'  => '[email protected]'), 

        array('fname'   => 'Josh', 
         'lname'   => 'Jojo', 
         'recipient'  => '[email protected]'), 

        array('fname'   => 'Sam', 
         'lname'   => 'Soso', 
         'recipient'  => '[email protected]'), 

        array('fname'   => 'Dave', 
         'lname'   => 'Dojo', 
         'recipient'  => '[email protected]')); 

foreach ($emaillist as &$person) 
{ 

    $fname  = $person['fname']; 
    $lname  = $person['lname']; 
    $recipient = $person['recipient']; 
    $todaysdate = date("F j, Y, g:i a"); 

    $find  = array("[[firstname]]", 
         "[[lastname]]", 
         "[[recipient]]", 
         "[[todaysdate]]"); 

    $replace = array($fname, 
         $lname, 
         $recipient, 
         $todaysdate); 

    $new  = str_replace($find, 
           $replace, 
           $contents); 

    // This will open/ create the file if non-existent. 

    $handle  = fopen("MYDRIVE/tempname.xml", "w+"); 

    $filename = 'MYDRIVE/tempname.xml'; 
    $filecontent = $new; 

    if (is_writable($filename)) 
    { 
     print "<b>Data added to file:</b>"; 
     print "<br>"; 
     print "<br>"; 

     if (!$handle = fopen($filename, 'a')) 
     { 
      print "Cannot open file ($filename)"; 
      exit; 
     } 

     // Adds $filecontent to file. 

     if (fwrite($handle, $filecontent) === FALSE) 
     { 
      print "Cannot write to file ($filename)"; 
      exit; 
     } 

     print "Success! <br><br> ($filecontent) <br><br> was added to ($filename)"; 

     fclose($handle); 

    } 
    else 
    { 
     print "<b>Error:</b>"; 
     print "The file $filename is not writable"; 
     exit(); 
    } 

    // Generate file name for use. 

    $filenamegen = date("d_h_i_s") . "_" . $person['recipient']; 

    if (rename ("MYDRIVE/tempname.xml", "MYDRIVE/" . $filenamegen . ".xml")) 
    { 
     print "File successfully saved as : $filenamegen"; 
     print "<br><br>"; 
    } 
    else 
    { 
     print "Error renaming file."; 
     exit(); 
    } 

print "</div>"; 

} 

?> 

上記のコードを実行すると、データのレコードごとに変数が正しく置き換えられて、4つのXML文書が作成されます。

私が直面している問題は、すべてのデータを単一のXMLファイルに取り込もうとすることです。誰かがこれに関するアドバイスを与えることができれば、それは非常に高く評価されるだろう。いつものように

おかげで、

+0

'$ new 'を' $ filecontent'に( '=')設定するのではなく '' $ new'を '' foreach'-loopの後ろに '' fwrite'を追加します。 – Andreas

答えて

0

この(未テスト)してみてください。

<?php 

$filename = 'MYDRIVE\XML_TEMPLATE2.xml'; 
$contents = file_get_contents($filename); 

$emaillist = array(array('fname'   => 'Brad', 
         'lname'   => 'BoBo', 
         'recipient'  => '[email protected]'), 

        array('fname'   => 'Josh', 
         'lname'   => 'Jojo', 
         'recipient'  => '[email protected]'), 

        array('fname'   => 'Sam', 
         'lname'   => 'Soso', 
         'recipient'  => '[email protected]'), 

        array('fname'   => 'Dave', 
         'lname'   => 'Dojo', 
         'recipient'  => '[email protected]')); 

// This will open/ create the file if non-existent. 

$handle  = fopen("MYDRIVE/tempname.xml", "w+"); 
$filename = 'MYDRIVE/tempname.xml'; 
$filecontent = ''; 
foreach ($emaillist as &$person) 
{ 

    $fname  = $person['fname']; 
    $lname  = $person['lname']; 
    $recipient = $person['recipient']; 
    $todaysdate = date("F j, Y, g:i a"); 

    $find  = array("[[firstname]]", 
         "[[lastname]]", 
         "[[recipient]]", 
         "[[todaysdate]]"); 

    $replace = array($fname, 
         $lname, 
         $recipient, 
         $todaysdate); 

    $new  = str_replace($find, 
           $replace, 
           $contents); 

    $filecontent .= $new; 
} 
if (is_writable($filename)) 
{ 
    print "<b>Data added to file:</b>"; 
    print "<br>"; 
    print "<br>"; 

    if (!$handle = fopen($filename, 'a')) 
    { 
     print "Cannot open file ($filename)"; 
     exit; 
    } 

    // Adds $filecontent to file. 

    if (fwrite($handle, $filecontent) === FALSE) 
    { 
     print "Cannot write to file ($filename)"; 
     exit; 
    } 

    print "Success! <br><br> ($filecontent) <br><br> was added to ($filename)"; 

    fclose($handle); 

} 
else 
{ 
    print "<b>Error:</b>"; 
    print "The file $filename is not writable"; 
    exit(); 
} 

// Generate file name for use. 

$filenamegen = date("d_h_i_s"); 

if (rename ("MYDRIVE/tempname.xml", "MYDRIVE/" . $filenamegen . ".xml")) 
{ 
    print "File successfully saved as : $filenamegen"; 
    print "<br><br>"; 
} 
else 
{ 
    print "Error renaming file."; 
    exit(); 
} 

print "</div>"; 

あなたXML_TEMPLATE2.xmlでのXMLヘッダを持っている場合は、あなたがそこにそれを削除し、代わりに前$filecontentに追加する必要がありますforeach -loop。ルートノードと同じ - の前にforeachを開き、foreachの後に閉じます。

$new .= str_replace($find,$replace,$contents); 

と:

+0

こんにちは、唯一の最初の結果 – mrdarb

+0

ちょうどその瞬間をチェック - 期待どおりに動作します。 'foreach'ループの前に' $ filecontent = '' '** **を定義しているかどうかを確認してください。 – Andreas

+0

こんにちは、ええとこれで運がまだありません! – mrdarb

1

いくつかありますが、私はそれはアンドレアスが言ったように、あなたがすべてのループで新しい変数$を割り当てる再だ、まず、より良い行われ、その連結演算子ドットを思い出すことができると考えていると考えてループの終わりに、$ newのすべてのループ反復が連結されます。

私はあなたがこのようドキュメントを開くことをお勧め:PHPがXMLで作業することができるようになります。この方法では

<? 

:この代わりの

<?php 

そして私はあなたがやっているのではなく、XMLを扱うために特定のライブラリを使うことを提案します。

simpleXml PHP

それはあなたのxmlを構築し、解析/ディスクとそれを作業のintead保存する方が良いでしょう...あなたは特別な文字で、将来的にトラブルの多くに直面するだろう、文字セット..etc ..

関連する問題