Почему я не получаю закрывающий узел XML для каждого прохода через этот цикл? - PullRequest
1 голос
/ 25 марта 2019

Я извлекаю некоторые записи из базы данных MySQL.Нет проблем, у меня есть 48 000 записей для работы.Я получаю все данные.Я смотрел на это, пока мои глаза плавают.Когда я пытаюсь преобразовать строки в XML, структура должна выглядеть следующим образом:

<listings>
    <listing (some attributes)></listing>
    <listing (some attributes)></listing>
    <listing (some attributes)></listing>
</listings>

Вместо этого XML структурируется следующим образом:

<listings>
    <listing (some attributes> 
        <listing (some attributes> 
           <listing (some attributes>
           </listing>
        </listing>
     </listing>
</listings>

Вот объявление и цикл, который создаетxml:

$dom = new DOMDocument('1.0','utf-8');
$node = $dom->createElement("listings");
$parnode = $dom->appendChild($node);

while ($row = @mysql_fetch_assoc($result)){
      // Add to XML document node
      $node = $dom->createElement("listing");
      $newnode = $parnode->appendChild($node);
      $newnode->setAttribute("id",$row['id']);
      $newnode->setAttribute("title",$row['title']);
      $newnode->setAttribute("latitude",$row['latitude']);
      $newnode->setAttribute("longitude",$row['longitude']);
}

1 Ответ

1 голос
/ 25 марта 2019

Вам необходимо добавить этот узел после того, как вы закончите его создание:

<?php

$arr = [
  [
    'id' => 1,
    'title' => 'title 1',
    'latitude' => '1.1',
    'longitude' => '2.1'
  ],
  [
    'id' => 2,
    'title' => 'title 2',
    'latitude' => '1.2',
    'longitude' => '2.2'
  ],
];

$dom = new DOMDocument('1.0','utf-8');
$parnode = $dom->createElement("listings");
while ($row = array_shift($arr)){
      // Add to XML document node
      $newnode = $dom->createElement("listing");
      $newnode->setAttribute("id",$row['id']);
      $newnode->setAttribute("title",$row['title']);
      $newnode->setAttribute("latitude",$row['latitude']);
      $newnode->setAttribute("longitude",$row['longitude']);
      $parnode->appendChild($newnode);
}
$dom->appendChild($parnode);

echo $dom->saveHTML();

Вывод:

<listings>
    <listing id="1" title="title 1" latitude="1.1" longitude="2.1"></listing> 
    <listing id="2" title="title 2" latitude="1.2" longitude="2.2"></listing> 
</listings>

Демо

FYI, Вы не должны использовать функции mysql_* в новом коде .Они устарели с версии 5.5 (июнь 2013 г.) и удалены с версии 7.0 (декабрь 2015 г.).Видите красное поле ?Узнайте о подготовленных утверждениях и используйте PDO или MySQLi - , эта статья поможет вам решить, какая из нихлучше для вас.

Кроме того, не используйте оператор подавления ошибок (@), поскольку он скрывает сообщения об ошибках, которые могут быть полезны при отладке вашего кода.Вы также должны всегда писать свой код, чтобы он не генерировал никаких ошибок PHP, включая уведомления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...