我在使用SimpleXML和addChild()时遇到了麻烦。
我试图从mysql数据库中的数据生成XML格式的订单文件。我希望文件形成如下:
<Ordreimport>
<Kunde>
<..>
<Orderline>
<data>
</orderline>
<orderline>
<data>
</orderline>
</kunde>
</ordreimport>
问题是以下代码
$OrderXML = new SimpleXMLElement('<?xml version="1.0" encoding="ISO-8859-1"?><OrdreImport></OrdreImport>');
While ($kunderad = mysql_fetch_array($HentKunde)) {
$OrderXML->addChild('Kunde');
$KundeInfo = $OrderXML->Kunde->addChild('KundeID',''); //BD60 - Kundekort - Kundenr
$OrdreHode = $OrderXML->Kunde->addChild('OrdreHode'); //OF14 - Ordrehode
$OrdreHode= $OrderXML->Kunde->OrdreHode->addChild('OrdreLinje');
while ($olrader = mysql_fetch_array($HentOrdrelinje)) {
$OrdreLinje = $OrderXML->Kunde->OrdreHode->OrdreLinje->addChild('StatusHB'); //se over.
}
Header('Content-type: text/xml');
echo $OrderXML->asXML();
给出以下结果:
<Ordreimport>
<Kunde>
<..>
<Orderline>
<data>
<data>
</orderline>
</kunde>
</ordreimport>
同样在循环中使用$OrdreHode= $OrderXML->Kunde->OrdreHode->addChild('OrdreLinje');
,就像我最初一样,给出相同的结果,除了它还为数据库中的每个附加订单行创建一个空的<orderline>
标记。这几乎是正确的,除了所有数据都在第一个<orderline>
标签中结束。
您正在使用整个XML树来添加节点。所以第一个将被选中。请改用当前生成的节点。
循环外的更多写标题和XML。
while ($kunderad = mysql_fetch_array($HentKunde))
{
$Kunde = $OrderXML->addChild('Kunde');
$KundeInfo = $Kunde->addChild('KundeID', ''); //BD60 - Kundekort - Kundenr
$OrdreHode = $Kunde->addChild('OrdreHode'); //OF14 - Ordrehode
$OrdreLinje = $OrdreHode->addChild('OrdreLinje');
// execute statement to query related data rows here
while ($olrader = mysql_fetch_array($HentOrdrelinje))
{
$OrdreLinje = $OrdreLinje->addChild('StatusHB'); //se over.
}
}
Header('Content-type: text/xml');
echo $OrderXML->asXML();
请注意,mysql_
函数在较新的PHP版本中是不安全和过时的。请改用mysqli_
或PDO
。
您没有显示如何查询该行的结果:
while ($olrader = mysql_fetch_array($HentOrdrelinje))
如果不在外部循环的每次迭代中执行与当前$kunderad
相关的语句,则内部循环将不会查询任何新数据集。我假设你确实做过并从最小的例子中删除了这个。