php simplexml добавление дочерних узлов в цикле - PullRequest
0 голосов
/ 23 февраля 2019

У меня проблемы с SimpleXML и addChild ().

Я пытаюсь сгенерировать файл заказа в XML из данных в базе данных MySQL.Я хочу, чтобы файл был сформирован так:

<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 голосов
/ 23 февраля 2019

Вы используете все дерево 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 вНа каждой итерации внешнего цикла внутренний цикл не будет запрашивать новые наборы данных.Я предполагаю, что вы действительно сделали это и вырезали это из минимального примера.

...