php simplexml 在循环中添加子节点
php simplexml adding children-nodes in a loop
我在使用 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
相关的语句,内循环将不会查询任何新的数据集。我假设您确实这样做了,并从最小示例中删除了它。
我在使用 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
相关的语句,内循环将不会查询任何新的数据集。我假设您确实这样做了,并从最小示例中删除了它。