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相关的语句,内循环将不会查询任何新的数据集。我假设您确实这样做了,并从最小示例中删除了它。