问题:我想从数据库获取所有位置并将其全部包含在<loc>
标记中,以下代码将每个位置放在<loc>
标记中,当我只需要一个<loc>
时。我知道它正在这样做,因为它在一个循环内(simpleXML部分),但不知道如何解决它。
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>
。
答案 0 :(得分: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
}
答案 1 :(得分: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>'