0

这是我的代码。它从mysql创建xml文件..

我的问题:

for($i=0; $i<count($str_exp1); $i++) // HERE 
{
  $str_exp2 = explode(",", $str_exp1[$i]);

  $newnode->setAttribute("lat", $str_exp2[0]);
  $newnode->setAttribute("lng", $str_exp2[1]);  

}

因为不显示所有数据...它只显示最新的一个数据..我找不到哪里有问题..

PS对不起我的英语

0

$doc =  new DOMDocument("1.0");
$node = $doc->createElement("marker");
$parnode = $doc->appendchild($node);


$result = mysql_query("SELECT * FROM usersline");
if(mysql_num_rows($result)>0)
{ 
  header("Content-type: text/xml");
  while ($mar = mysql_fetch_array($result))
  {

    $node = $doc->createElement("line");
    $newnode = $parnode->appendChild($node);
    $newnode->setAttribute("id_line", $mar['id_line']);
    $newnode->setAttribute("color", $mar['colour']);
    $newnode->setAttribute("width", $mar['width']);

    $node = $doc->createElement("point");
    $newnode = $parnode->appendChild($node);

    $str_exp1 = explode(";", $mar['coordinats']);

    for($i=0; $i<count($str_exp1); $i++) // HERE 
    {
      $str_exp2 = explode(",", $str_exp1[$i]);

      $newnode->setAttribute("lat", $str_exp2[0]);
      $newnode->setAttribute("lng", $str_exp2[1]);  

    }


  }
  $xmlfile = $doc->saveXML();
  echo $xmlfile;
}
else
{
  echo "<p>Ëèíèé íå îáíàðóæåíî!</p>";
}
4

2 回答 2

1

您的问题是您为同一个节点设置了多个值。所以你总是用最新的纬度/经度值覆盖属性值。

相反,您需要为每个纬度/经度对添加一个新元素,因为 XML 元素没有重复的属性。

基于您的问题的一些示例代码,如您所见,我介绍了一些功能以使事情更加模块化:

$result = $db->query("SELECT * FROM usersline");

if (!$result || !count($result)) {
    echo "<p>Ëèíèé íå îáíàðóæåíî!</p>";
    return;
}

$doc = new DOMDocument("1.0");
$doc->loadXML('<marker/>');
$marker = $doc->documentElement;

foreach ($result as $mar) {

    $line = $doc->createElement('line');
    $attributes = array_map_array(['id_line', 'colour' => 'color', 'width'], $mar);
    element_add_attributes($line, $attributes);
    foreach (coordinates_to_array($mar['coordinats']) as $latlong) {
        $point = $doc->createElement('point');            
        element_add_attributes($point, $latlong);
        $line->appendChild($point);
    }

    $marker->appendChild($line);

}

header("Content-type: text/xml");
echo $doc->saveXML();


function element_add_attributes(DOMElement $element, array $attributes)
{
    foreach ($attributes as $name => $value) {
        if (!is_string($name)) continue;
        $element->setAttribute($name, $value);
    }
}

function array_map_array(array $map, array $array)
{
    $result = array();
    foreach ($map as $alias => $name) {
        $source = is_string($alias) ? $alias : $name;
        $result[$name] = $array[$source];
    }
    return $result;
}

function coordinates_to_array($coordinates)
{
    $result = array();
    $coordinatePairs = explode(";", $coordinates);

    foreach ($coordinatePairs as $coordinatePair) {
        list($pair['lat'], $pair['lng']) = explode(',', $coordinatePair, 2) + ['', ''];
        $result[] = $pair;
    }

    return $result;
}

我希望这个示例对您有所帮助,并向您展示一些如何解决问题的方法,以便您的代码变得更加简单和稳定。


要使用$db->query(...)首先定义一个具有该query方法的类:

class DB {
    public function query($sql) {
        $dbhandle = mysql_query($sql);
        $result  = array();

        while ($mar = mysql_fetch_array($dbhandle)) 
            $result[] = $mar
        ;

        return $result;
    }
}

然后实例化它:

$db = new DB();

然后,您可以将上面的代码用于该部分。

对于 PHP 5.4 数组表示法的问题,例如在这一行中:

$attributes = array_map_array(['id_line', 'colour' => 'color', 'width'], $mar);

首先从中提取数组:

$mapping    = ['id_line', 'colour' => 'color', 'width'];
$attributes = array_map_array($mapping, $mar);

array(然后用and)符号而不是[and定义数组]

$mapping    = array('id_line', 'colour' => 'color', 'width');
$attributes = array_map_array($mapping, $mar);

在其他地方也这样做,例如

['', '']

变成

array('', '')

和类似的。

于 2013-02-05T19:28:39.393 回答
0

用这个替换你的代码:

$str_exp1 = explode(";", $mar['coordinats']);

$newnode->setAttribute("lat", $str_exp1[0]);
$newnode->setAttribute("lng", $str_exp1[1]);
于 2013-02-05T12:56:35.063 回答