使用字符串输出XML的Foreach循环 [英] Foreach loop using string to output XML

查看:95
本文介绍了使用字符串输出XML的Foreach循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在php脚本上,如何使用字符串输出从msql数据库获取值的XML数据来进行foreach循环?我从simpleXmlElement内部的while循环中获取了一些代码,希望它可以输出xml,但无法正常工作.我正在使用的服务器不允许使用SimpleXMLElement类,因此我需要使用该字符串进行foreach循环并根据需要输出xml.

On a php script, how does one do a foreach loop using a string to output XML data that gets values from a msql database? I took some code from the while loop that's inside the simpleXmlElement hoping it would output xml but it did not work. The server i'm working on doesn't allow the class SimpleXMLElement so i need to use the string to do a foreach loop and output the xml as needed.

到目前为止我所拥有的:

What i have so far: Edited:

<?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 can iterate any array or object that implements traversable. The result of PDOStatement::fetch() is the record/row. Just provide the statement to foreach.

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

像这样的转储更好的API是 XMLWriter .它将结果直接写入流,而无需先将整个文档存储在内存中.使用XML API也会根据需要进行转义.这是一个小例子:

The better API for dumps like that is XMLWriter. It writes the result directly to a stream, without storing the whole document in memory first. Using an XML API will take care of the escaping as needed, too. Here is a small example:

$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

In DOM you create, append and configure nodes. Here is a small example: https://stackoverflow.com/a/21760903/2265374

这篇关于使用字符串输出XML的Foreach循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆