2010-11-30 20 views
1

問題的列表:我想從數據庫中的所有位置,幷包住它們都在<loc>標籤,下面的代碼放在一個<loc>標籤中的每個位置,導致數<loc>當我只需要一個。我知道這是因爲它在一個循環內(simpleXML部分),但不知道如何解決它。SimpleXML的問題,包裝物品在一個<tag>

if($r7){ //$r7 = If query was successfull..  
     while($row = mysqli_fetch_array($r7, MYSQLI_ASSOC)){ 
     $convXML_from_loc = $convXML_from->addChild('loc',$row['location']); 
     } 
    } 

如果我把它拿出來循環的,它只是將第一個位置的數據庫有(IIRC)。

這個替代方案只是echo "<xml>";,我認爲這是不好的做法,因爲沒有父母和子女的元素,一切都會在同一水平上。

我希望在這個問題上的任何指導,以及有關此主題的任何相關信息的鏈接。

問候。

編輯:如果不清楚,我需要把它們全部放在一個loc標籤內,如<loc>Row 1, Row 2</loc>。目前它給予<loc>Row 1</loc><loc>Row 2</loc>

回答

1

你有一個while循環在每一行迭代。你會在循環中做任何事情,因爲有多少行。因此,您將製作儘可能多的<loc>元素,因爲有行,每行一個。

解決方案是生成一個字符串,其中包含while循環中的所有行數據,然後在該循​​環外部添加該字符串的<loc>元素。這導致addChild()只被調用一次,因此只創建一個<loc>元素。

$location_data; 

if($r7){ //$r7 = If query was successfull..  
    while($row = mysqli_fetch_array($r7, MYSQLI_ASSOC)){ 
     $location_data .= $row['location'] . ' ,'; 
    } 
} 

$location_data = substr($location_data, 0, -2); // strip off the final space and comma 
$convXML_from_loc = $convXML_from->addChild('loc',$location_data); // will result in '<loc>Row 1, Row 2</loc>' 
1

你的意思是會產生下面的XML?

<loc> 
    <location>row 1</location> 
    <location>row 2</location> 
    <location>row 3</location> 
</loc> 

嘗試:

if($r7){ //$r7 = If query was successfull..  
    $loc = $convXML_from->addChild('loc'); // Add the <loc> tag 
    while($row = mysqli_fetch_array($r7, MYSQLI_ASSOC)){ 
     $loc->addChild('location',$row['location']); // Add a <location> with value 
    } 
} 

鑑於你進一步的解釋,請嘗試:

if($r7){ //$r7 = If query was successful...  
    $locations = array(); 
    while($row = mysqli_fetch_array($r7, MYSQLI_ASSOC)){ 
     $locations[] = $row['location']); 
    } 

    $convXML_from->addChild('loc', implode(', ', $locations)); // Add the <loc> tag 
} 
+0

不,如果不清楚,對不起。在我的數據庫中有2行與位置,我需要把它們都放在一個單一的位置標記,像'行1行2` – Daniel 2010-12-01 00:19:36

+0

我敢肯定你的第二個例子會工作,但最終的答案已經工作,所以我沒有時間去嘗試,upvoted,但沒有標記爲最佳答案。 – Daniel 2010-12-03 14:50:31