在php脚本中,如何使用字符串来执行foreach循环以输出从msql数据库获取值的XML数据?我从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;
*/
答案 0 :(得分:0)
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