2011-08-05 3 views
0

노드 이름을 계속 변경하지 않고도 XML 객체를보다 동적으로 채울 수있는 방법을 찾으려고합니다. 나는이와 비슷한 코드 :루프에 XML 채우기

편집 : 실제 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

일부 샘플 xml, 찾고있는 출력을 보여줍니다. –

+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> 

세 번째 인수 $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)입니다). 모든 열을 원한다면 루프 시작 부분에있는 두 줄을 제거하면됩니다.

편집 : 젠장, 나는이었다 너무 늦게 16초 : <