2010-06-24 82 views
2

我使用while循環創建XML,但現在我需要將生成的XML與XML標題信息和包裝標記進行前綴和追加,但我努力想要將它工作中,這裏是我的代碼,將while循環生成的xml分配給一個變量

$result = mysql_query("SELECT * FROM users") 
or die(mysql_error()); 

$row = mysql_fetch_array($result); 

    while ($row = mysql_fetch_array($result)) { 
     $pumaXML = "<userDetails>"; 
     $pumaXML .= "<userID>".$row['uid']."</userID>"; 
     $pumaXML .= "<userName>".$row['userName']."</userName>"; 
     $pumaXML .= "<points>".$row['points']."</points>"; 
     $pumaXML .= "<imageURL>".$row['imageURL']."</imageURL>"; 
     $pumaXML .= "<thumbURL>".$row['thumbURL']."</thumbURL>"; 
     $pumaXML .= "</userDetails>"; 
    }; 

我似乎無法找到一個方法來做到這一點,我也試圖使一個功能,但沒有去說好了,這裏要說的是代碼,

function createXML($result) { 
    while ($row = mysql_fetch_array($result)) { 
     $pumaXML = "<userDetails>"; 
     $pumaXML .= "<userID>".$row['uid']."</userID>"; 
     $pumaXML .= "<userName>".$row['userName']."</userName>"; 
     $pumaXML .= "<points>".$row['points']."</points>"; 
     $pumaXML .= "<imageURL>".$row['imageURL']."</imageURL>"; 
     $pumaXML .= "<thumbURL>".$row['thumbURL']."</thumbURL>"; 
     $pumaXML .= "</userDetails>"; 
    }; 
    return $pumaXML; 
}; 

Thanx提前!

+0

你是通過字符串連接生成XML而不是使用DOM正確生成XML的任何原因? – Gordon 2010-06-24 08:28:40

+0

好吧,這似乎是最簡單的方法,我不知道如何去做與DOM做。 – Odyss3us 2010-06-24 08:34:51

回答

2

這裏是如何與DOM做到這一點:

function createUserDetailsXml(array $result) { 

    $dom = new DOMDocument; 
    $dom->formatOutput = TRUE; // enable automatic indenting 
    $dom->loadXML('<users/>'); // set root node 

    foreach($result as $row) { 

     // create user-details node 
     $user = $dom->createElement('user-details'); 

     // create and append details to user-details node 
     $user->appendChild(
      $dom->createElement('user-id', $row['uid'])); 
     $user->appendChild(
      $dom->createElement('user-name', $row['userName'])); 
     $user->appendChild(
      $dom->createElement('user-points', $row['points'])); 
     $user->appendChild(
      $dom->createElement('image-url', $row['imageURL'])); 
     $user->appendChild(
      $dom->createElement('thumb-url', $row['thumbURL'])); 

     // add user-details node to XML document, e.g. users node 
     $dom->documentElement->appendChild($user); 
    }; 
    return $dom->saveXML(); // returns the formatted XML 
}; 

注意函數需要你充分結果數組中傳遞,所以我可以測試它:

$result = array(
    array(
     'uid'  => 1, 
     'userName' => 'Gordon', 
     'points' => PHP_INT_MAX, 
     'imageURL' => 'http://example.com/gordon.jpg', 
     'thumbURL' => 'http://example.com/t_gordon.jpg' 
    ), 
    array(
     'uid'  => 2, 
     'userName' => 'John <blink>"Frigging"</blink> Doe', 
     'points' => 0, 
     'imageURL' => 'http://example.com/johndoe.jpg', 
     'thumbURL' => 'http://example.com/t_johndoe.jpg' 
    ) 
); 
echo createUserDetailsXml($result); 

功能然後會返回

<?xml version="1.0"?> 
<users> 
    <user-details> 
    <user-id>1</user-id> 
    <user-name>Gordon</user-name> 
    <user-points>2147483647</user-points> 
    <image-url>http://example.com/gordon.jpg</image-url> 
    <thumb-url>http://example.com/t_gordon.jpg</thumb-url> 
    </user-details> 
    <user-details> 
    <user-id>2</user-id> 
    <user-name>John &lt;blink&gt;"Frigging"&lt;/blink&gt; Doe</user-name> 
    <user-points>0</user-points> 
    <image-url>http://example.com/johndoe.jpg</image-url> 
    <thumb-url>http://example.com/t_johndoe.jpg</thumb-url> 
    </user-details> 
</users> 

請注意,DOM逃脫了J中的特殊字符ohn Doe的名字自動爲你。 DOM還會確保XML元素名稱(或者如果您使用它們的屬性)在語法上是有效的。它還添加了XML Prolog。

+0

+1這確實是創建XML – DrColossos 2010-06-24 08:51:03

+0

@DrColossos謝謝最優雅的方式。最優雅的方式是讓數據庫直接返回XML,但我認爲MySql還不能做到這一點。 – Gordon 2010-06-24 08:55:41

+1

可以擴展http://dev.mysql.com/tech-resources/articles/xml-in-mysql5.1-6.0.html我自己用過,但查詢可能很快就無法閱讀;)當然它在DOM或任何其他方面都不是「真正的」XML,而是在主題 – DrColossos 2010-06-24 09:00:52