PHP SimpleXML在循环中添加子节点

时间:2019-02-23 08:37:03

标签: php simplexml

我在使用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>标签结尾。

1 个答案:

答案 0 :(得分:0)

您正在使用整个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相关的语句,内循环将不查询任何新的数据集。我认为您实际上是这样做的,并从最小的示例中删除了它。