Проблема SimpleXML, упаковка списка элементов в один <tag> - PullRequest
1 голос
/ 01 декабря 2010

Проблема: Я хочу получить все местоположения из базы данных и заключить их в тег <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 ]

1 голос
/ 02 декабря 2010

У вас есть цикл 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 голос
/ 01 декабря 2010

Вы имеете в виду что-то, что сгенерирует приведенный ниже 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
}
...