0

XML Response verarbeiten

Hallo zusammen, 

per API Get rufe ich bei unserem Logistiker Lagerbestände von einzelnen Artikeln ab. Als Response erhalte ich pro SKU eine XML Datei und speichere diese dann nach parseXML in einem Textfeld. 

Das Textfeld sieht dann folgendermaßen aus: 

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfGetStockLevelReturn xmlns:xsd="http://www.url.org/2001/XMLSchema" xmlns:xsi="http://www.url.org/2001/XMLSchema-instance" xmlns="http://url.de/">
  <GetStockLevelReturn>
    <StockLevel>0</StockLevel>
    <InProcess>0</InProcess>
    <Reserved>0</Reserved>
    <BackOrder>0</BackOrder>
    <StockIndex>BAD</StockIndex>
    <HasError>false</HasError>
  </GetStockLevelReturn>
  <GetStockLevelReturn>
    <StockLevel>24</StockLevel>
    <InProcess>0</InProcess>
    <Reserved>0</Reserved>
    <BackOrder>0</BackOrder>
    <StockIndex>CCS-MUC</StockIndex>
    <HasError>false</HasError>
  </GetStockLevelReturn>
  <GetStockLevelReturn>
    <StockLevel>1</StockLevel>
    <InProcess>0</InProcess>
    <Reserved>0</Reserved>
    <BackOrder>0</BackOrder>
    <StockIndex>REWORK</StockIndex>
    <HasError>false</HasError>
  </GetStockLevelReturn>
</ArrayOfGetStockLevelReturn>

 

Es werden in diesem Beispiel 3 verschiedene StockIndexes aufgelistet. Mir stellt sich jetzt die Frage wie ich an die Werte vom <GetStockLevelReturn> mit dem StockIndex "CCS-MUC" komme. In diesem Fall der mittlere. Problem ist, dass sich die Position ändern kann. Also komme ich mit item(any, 1) an dieser Stelle nicht weiter. Es kann auch sein, dass er an 1. oder letzter Stelle kommt. 

Ich hab schon einiges probiert, aber bis dato leider ohne Erfolg. Habt ihr vielleicht eine Idee? 

Freue mich auf den Austausch. 

Viele Grüße,

Andi

4 Antworten

null
    • mirko3
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hi Andi. Schau mal, ob Dir das hilft. Mirko

    let xml := "<?xml version=""1.0"" encoding=""utf-8""?>
    <ArrayOfGetStockLevelReturn xmlns:xsd=""http://www.url.org/2001/XMLSchema"" xmlns:xsi=""http://www.url.org/2001/XMLSchema-instance"" xmlns=""http://url.de/"">
      <GetStockLevelReturn>
        <StockLevel>0</StockLevel>
        <InProcess>0</InProcess>
        <Reserved>0</Reserved>
        <BackOrder>0</BackOrder>
        <StockIndex>BAD</StockIndex>
        <HasError>false</HasError>
      </GetStockLevelReturn>
      <GetStockLevelReturn>
        <StockLevel>24</StockLevel>
        <InProcess>0</InProcess>
        <Reserved>0</Reserved>
        <BackOrder>0</BackOrder>
        <StockIndex>CCS-MUC</StockIndex>
        <HasError>false</HasError>
      </GetStockLevelReturn>
      <GetStockLevelReturn>
        <StockLevel>1</StockLevel>
        <InProcess>0</InProcess>
        <Reserved>0</Reserved>
        <BackOrder>0</BackOrder>
        <StockIndex>REWORK</StockIndex>
        <HasError>false</HasError>
      </GetStockLevelReturn>
    </ArrayOfGetStockLevelReturn>";
    let jsonResult := parseXML(xml);
    let result := for i in jsonResult.ArrayOfGetStockLevelReturn.GetStockLevelReturn do
            if contains(text(i), "CCS-MUC") then
                i
            end
        end;
    item(result, 0).StockLevel.@
    
      • Andi_Neumaier
      • vor 1 Jahr
      • Gemeldet - anzeigen

       vielen Dank für deine Idee. Ganz funktioniert es so leider nicht. Komischerweise klappt es nur dann nicht, wenn CCS-MUC an 1. Stelle vom Array vorkommt. Wenn es an 2. , 3. oder letzter Stelle vorkommt, klappt es. Ne Idee warum? 

      LG, Andi

      • mirko3
      • vor 1 Jahr
      • Gemeldet - anzeigen

       kann ich leider so nicht nachvollziehen. Ich habe es an alle 3 Indexe verschoben und komme immer zum Ergebnis "24". Das Array enthält ja auch nur 3 Objektelemente bei mir. Also Pos 0,1,2 und alle werden angezeigt. Selbst wenn ich die Anordnung der Objektelemente in einem Arrayelement verschiebe, dann erreiche ich das gleiche Resultat. Bei mir gibt 

      jsonResult.ArrayOfGetStockLevelReturn.GetStockLevelReturn
      

      das Array dieser Objekt wieder und mit 

      item(jsonResult.ArrayOfGetStockLevelReturn.GetStockLevelReturn, INDEX)

      kann ich diese ansprechen. Die Schleife sucht ja nur nach dem einem Arrayinhalt {StockIndex:"CSS-MUC} - > es entsteht ein Array mit einem Wert und mit item(result,0) spreche ich diesen an. Das gleiche Ergebnis erhältst Du ja mit first(result).StockLevel.@. Tut mir leid, wenn es Dir nicht hilft. Ich hoffe, jemand kann Dir weiter helfen - ich bin ein paar Tage nicht online. Gruß Mirko

      P.S. ein Unterschied ist mir noch aufgefallen. Der geparste JSON hat bei mir doppelte Doppelanführungszeichen (lt. Ninoxdoku) und bei Dir sind es einfache doppelte (liest sich komisch). Ich weiß nicht, ob es einen Unterschied macht.

      • Andi_Neumaier
      • vor 1 Jahr
      • Gemeldet - anzeigen

       jetzt hab ich das Problem gefunden. Es kann sein, dass auch nur 1 Objektelement zurückkommt, weil ggfs. kein BAD oder REWORK Stock vorhanden ist. Wenn das der fall ist, funktioniert dein Ansatz leider nicht. Habs jetzt aber so gelöst: 

      'XML Text' := response.result;
          let myJSON := parseXML('XML Text');
          let myCount := count(myJSON.ArrayOfGetStockLevelReturn.GetStockLevelReturn);
          if myCount > 1 then
              let result := for i in myJSON.ArrayOfGetStockLevelReturn.GetStockLevelReturn do
                      if contains(text(i), "CCS-MUC") then
                          i
                      end
                  end;
              let myStockLevel := number(item(result, 0).StockLevel.@);
              let myInProcess := number(item(result, 0).InProcess.@);
              let myReserved := number(item(result, 0).Reserved.@);
              let myBackOrder := number(item(result, 0).BackOrder.@);
              'Lagerbestand CCS-MUC' := myStockLevel - myInProcess - myReserved - myBackOrder
          else
              let result2 := myJSON.ArrayOfGetStockLevelReturn.GetStockLevelReturn;
              let myStockLevel := number(first(result2).StockLevel.@);
              let myInProcess := number(first(result2).InProcess.@);
              let myReserved := number(first(result2).Reserved.@);
              let myBackOrder := number(first(result2).BackOrder.@);
              'Lagerbestand CCS-MUC' := myStockLevel - myInProcess - myReserved - myBackOrder
          end
      

      Was hältst du davon? Gibts noch ne charmantere Variante? 

      LG, Andi