SimpleXML问题,将一个项目列表包装在一个<tag> </tag>中

时间:2010-11-30 21:00:37

标签: php mysql simplexml

问题:我想从数据库获取所有位置并将其全部包含在<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>

2 个答案:

答案 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>'