Цикл Foreach с использованием строки для вывода XML

На php-скрипте, как сделать цикл foreach с использованием строки для вывода данных XML, которые получают значения из базы данных msql? Я взял код из цикла while, который находится внутри simpleXmlElement, надеясь, что он выведет xml, но это не сработало. Сервер, над которым я работаю, не допускает класс SimpleXMLElement, поэтому мне нужно использовать строку для создания цикла foreach и вывести xml по мере необходимости.

Что я до сих пор: Отредактировано:

<?php #Programmer: Moses require('./.env'); // Opens a connection to a mySQL server try { $db = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME. ';charset=utf8', DB_USERNAME, DB_PASSWORD); } catch (PDOException $e) { echo "An Error occured, could not connect!"; } $statement = $db->query('SELECT * FROM markers'); //$result = $statement->fetchAll(PDO::FETCH_ASSOC); $xmlWriter = new XMLWriter(); $xmlWriter->openUri('php://stdout'); $xmlWriter->startDocument(); $xmlWriter->setIndent(2); $xmlWriter->startElement('markers'); foreach ($statement as $row) { $xmlWriter->startElement('marker'); $xmlWriter->writeAttribute('name', $row['name']); $xmlWriter->writeAttribute('address', $row['address']); $xmlWriter->writeAttribute('lat', $row['lat']); $xmlWriter->writeAttribute('lng', $row['lng']); $xmlWriter->writeAttribute('type', $row['type']); $xmlWriter->endElement(); } $xmlWriter->endElement(); $xmlWriter->endDocument(); /** $str = <<<XML <xml> <marker name="Walvis Bay Live" lat="-22.956112" lng="14.508056" address="Walvis bay namibia Africa" type="Weather Station"></marker> <marker name="Centro Surf Bracciano" lat="11.588599" lng="43.145851" address="djibouti djibouti" type="Weather Station"></marker> <marker name="Bashewa Weather" lat="-25.825212" lng="28.312128" address="Garstfontein Rd Pretoria" type="Weather Station"></marker> <marker name="Nelspruit Live" lat="-25.475298" lng="30.969416" address="nelspruit south africa" type="Weather Station"></marker> <marker name="Richards Bay Live" lat="-28.780727" lng="32.038284" address="richards bay south africa" type="Weather Station"></marker> <marker name="Cape Town Live" lat="-33.923775" lng="18.423346" address="cape town south africa" type="Weather Station"></marker> </xml> XML; header("Content-type: text/xml"); echo $str; exit; */ /** $xml = new SimpleXMLElement('<xml/>'); while ($row = $statement->fetch(PDO::FETCH_ASSOC)) { $node = $xml->addChild('marker'); $node->addAttribute('name', $row['name']); $node->addAttribute('address', $row['address']); $node->addAttribute('lat', $row['lat']); $node->addAttribute('lng', $row['lng']); $node->addAttribute('type', $row['type']); } header('Content-type: text/xml'); print($xml->asXML()); exit; */ 

foreach может выполнять итерацию любого массива или объекта, который реализует сквозную передачу. Результатом PDOStatement::fetch() является запись / строка. Просто представьте заявление для foreach.

 foreach($statement as $row) { ... 

Лучшим API для таких дампов является XMLWriter . Он записывает результат непосредственно в поток, не сохраняя сначала весь документ в памяти. Использование XML API также позаботится об экранировании. Вот небольшой пример:

 $statement = [ [ 'name' => 'one', 'location' => '...', /* ... */], [ 'name' => 'two', 'location' => '...', /* ... */] ]; $xmlWriter = new XMLWriter(); $xmlWriter->openUri('php://stdout'); $xmlWriter->startDocument(); $xmlWriter->setIndent(2); $xmlWriter->startElement('markers'); foreach ($statement as $row) { $xmlWriter->startElement('marker'); $xmlWriter->writeAttribute('name', $row['name']); /* other attributes ... */ $xmlWriter->endElement(); } $xmlWriter->endElement(); $xmlWriter->endDocument(); 

Вывод:

 <?xml version="1.0"?> <markers> <marker name="one"/> <marker name="two"/> </markers> 

В DOM вы создаете, добавляете и настраиваете узлы. Вот небольшой пример: https://stackoverflow.com/a/21760903/2265374