2011-08-05 21 views
0

ノードの名前を絶えず変更しなくても、XMLオブジェクトをより動的に生成する方法を見つけようとしています。私は次のようにいくつかのコード:XMLにループを設定する

EDITは:実際のDB構造をインラインするデータを変更:

$query = ("Select order_id, created_on, updated_on, status from table orders;"); 

// Execute query 
$result = mysql_query($query, $link) or die("Could not complete database query"); 

// Populate array 
while(($resultArray[] = mysql_fetch_assoc($result)) || array_pop($resultArray)); 

    $doc = new DOMDocument(); 
    $doc->formatOutput = true; 

    $r = $doc->createElement("data"); 
    $doc->appendChild($r); 

    foreach($resultArray as $record) 
    { 
    $b = $doc->createElement("record"); 

    $record1 = $doc->createElement("Order"); 
    $record1->appendChild(
    $doc->createTextNode($record['order_id']) 
); 
    $b->appendChild($record1); 

    $record2 = $doc->createElement("Created"); 
    $record2->appendChild(
    $doc->createTextNode($record['created_on']) 
); 
    $b->appendChild($record2); 

    $record3 = $doc->createElement("Updated"); 
    $record3->appendChild(
    $doc->createTextNode($record['updated_on']) 
); 
    $b->appendChild($record3); 

    $record4 = $doc->createElement("Status"); 
    $record4->appendChild(
    $doc->createTextNode($record['status']) 
); 
    $b->appendChild($record4); 

    $r->appendChild($b); 
    } 

    echo $doc->saveXML(); 

// Close connection 
mysql_close($link); 

これは結構ですが、私は私が持っているクエリで3番目の列を追加したい場合ループにも追加します。実際にこれを行うより良い方法があると確信しています。

アドバイスはありますか?

ありがとうございました。

+0

あなたが探している出力をいくつか見てみましょう。 –

+0

@Saad、更新しました。アドバイスをいただきありがとうございます。 – jared

答えて

0

たぶん私が書いたこのクラスはあなたを助けるでしょう...

それを使用する方法
<?PHP 
class ArrayTo 
{ 
    protected static function array2xml($xml, $arr, $elements) 
    { 
     foreach($arr as $key => $value) 
     { 
      $element = isset($elements[0]) ? $elements[0] : $key; 
      if(is_array($value)) 
      { 
       $xml->startElement($element); 
       self::array2xml($xml, $value, array_slice($elements, 1)); 
       $xml->endElement(); 
       continue; 
      } 
      $xml->writeElement($element, $value); 
      $elements = array_slice($elements, 1); 
     } 
    } 

    public static function xml($arr, $root = 'root', $elements = Array(), $version = '1.0', $encoding = 'UTF-8') 
    { 
     $xml = new XMLWriter(); 
     $xml->openMemory(); 
     $xml->startDocument($version, $encoding); 
     $xml->startElement($root); 
     self::array2xml($xml, $arr, $elements); 
     $xml->endElement(); 
     return $xml->outputMemory(true); 
    } 
} 
?> 

...

$data = array(
    "column1" => "im column 1", 
    "column2" => "im column 2", 
    "column3" => "im column 3", 
    "column4" => "im column 4", 
    "column5" => "im column 5", 
); 

echo ArrayTo::xml($data, 'table'); 

// output 
<?xml version="1.0" encoding="UTF-8"?> 
<table> 
    <column1>im column 1</column1> 
    <column2>im column 2</column2> 
    <column3>im column 3</column3> 
    <column4>im column 4</column4> 
    <column5>im column 5</column5> 
</table> 

第3引数$elementsを使用して、レベルのカスタムキーを持つ$キーを上書きすることもできます。例のために...

echo ArrayTo::xml($data, 'table', array('COLUMN_1', 'COLUMN_2')); 

// output 
<?xml version="1.0" encoding="UTF-8"?> 
<table> 
    <COLUMN_1>im column 1</COLUMN_1> 
    <COLUMN_2>im column 2</COLUMN_2> 
    <column3>im column 3</column3> 
    <column4>im column 4</column4> 
    <column5>im column 5</column5> 
</table> 
0

私はそのようなことだろう。

$elemColMap = array(
    'Column1' => 'First_Column', 
    'Column2' => 'Second_Column', 
); 

foreach($resultArray as $record) 
{ 
    $b = $doc->createElement("record"); 

    foreach($elemColMap as $xmlElem => $dbCol) { 
     $record1 = $doc->createElement($xmlElem); 
     $record1->appendChild(
      $doc->createTextNode($record[$dbCol]) 
     ); 
     $b->appendChild($record1);   
    } 

    $r->appendChild($b); 
} 
0

をあなたは行うことができます。もちろん

$column_num = 1; 
foreach ($record as $r_key => $r_value) 
{ 
    if (!preg_match('/_Column$/', $r_key) 
     continue; 

    $xml_record = $doc->createElement("Column".$column_num); 
    $xml_record->appendChild(
      $doc->createTextNode($r_value) 
     ); 
    $b->appendChild($xml_record); 
    $column_num++; 
} 

を、あなたは私たちに正確なDB構造を与えられていないので、私は列あなたと仮定しています追加したいものは_Columnで終わっています(そのため、!preg_match('/_Column$/', $r_key)があります)。すべての列が必要な場合は、ループの最初の2行を削除してください。

EDIT:いまいましい、私は遅すぎる16秒であった:<

関連する問題