2016-07-24 26 views
0

Ich versuche, Kategorie-ID zu extrahieren, wenn primäre = true durch Gruppierung von Produkt-IDMule Dataweave Objekt zu Array Fehlern

%input payload application/xml 
%output application/java 
--- 
using (c=payload.catalog.*category-assignment default []) 

((c default []) filter ([email protected] != "delete") groupBy [email protected] map ({ 

    (($ default []) filter ($.primary == 'true') map ({ 
      field3:[email protected] 
     }) when $.primary != null otherwise field3:""), 

     cat-id: [email protected] joinBy "||" , 
     primary-flag:$.primary 

// (($ default []) filter ($.primary matches /true/) map ({ 
//   //ur code here when equals to shipping charges 
//   field3:[email protected] 
//  }) when $.primary != null otherwise []) , 

})) 

ich mit mehrere Kombination und Filtern ausprobiert. Filter arbeitet in der Regel mit XML-Attribute, aber hier geben Ausnahme

cast to com.mulesoft.weave.model.structure.ObjectSeq (java.lang.ClassCastException). Message payload is of type: ReceiverFileInputStream 

Probeneingang -

<?xml version="1.0" encoding="UTF-8"?> 
<catalog xmlns="http://www.example.com/xml/impex/catalog/2006-10-31"> 
<category-assignment product-id="D711069" category-id="4160"> 
    <primary>true</primary> 
    </category-assignment> 
<category-assignment product-id="D711069" category-id="DANIEL_4160"/> 
</catalog> 

Irgendwelche Vorschläge hier?

habe ich versucht, einen anderen Satz von Transformation nur für Demo, nicht funktioniert -

%input payload application/xml 
%output application/xml 
--- 

Test:{((payload.catalog.*category-assignment default []) groupBy [email protected] pluck { 

     product-id:$$, 
     cat-id: [email protected] joinBy "||" , 
     primary-flag:$[0].primary, 

     field3:[email protected][?($.primary == "true")] 

    })} 

Antwort

0

Versuchen Sie diesen Ausdruck aus. Können Sie Ihre erwartete Leistung ausarbeiten?

using (c=payload.catalog.*category-assignment default []) 
(c[?(($.primary == "true") and ([email protected] != "delete"))] groupBy [email protected] map { 
    field3:[email protected], 
    primary-flag:$.primary 
}) 

Aktualisiert dataweave wie pro Ihre Kommentare:

%dw 1.0 
%output application/csv 
--- 

payload.catalog.*category-assignment[?(($.primary == "true") and ([email protected] != "delete"))] groupBy [email protected] map { 
productid:[email protected][0], 
categoryid: arrayToString([email protected], sizeOf [email protected]) 

globalen Konfigurationselement hinzufügen, wie unten dargestellt:

<configuration doc:name="Configuration"> 
    <expression-language> 
     <global-functions> 
def arrayToString(arrayObj,length){ 
String r=null; 
    if(arrayObj==null){ 
     return "null"; 
    }else if(arrayObj==""){ 
     return "Empty"; 
    }else{ 
     for (String s:arrayObj) { 
      if(r != null) 
       r = r + '||' + s; 
      else { 
       r = s; 
      } 
     } 
     return r; 
    } 
} 
     </global-functions> 
    </expression-language> 
</configuration> 
+0

Ich versuche, CSV, field1 = Kategorie-ID, field2 = Produkt zu erstellen -id (Gruppierung des Produkts), field3 = Kategorie-ID, wenn primary = true –

+0

wie oben xml, csv sollte wie D711069, 4160 aussehen || DANIEL_4160, 4160 müssen wir der Kategorie mit || folgen –

+0

obigen Code funktioniert für einzelne Knoten wahr , aber wenn ich mehrere Knoten übergeben, gibt es Fehler –

0

diesen Ausdruck Versuchen Sie, es wird die CSV nach Ihren angegebenen Anforderung produzieren (s).

%dw 1.0 
%output application/csv header=true 
--- 
using (ca = payload.catalog.*category-assignment) 
(
payload.catalog map (catVal, idx) -> ({ 
    ( 
     ca groupBy [email protected] pluck { 
      product-id:$$, 
      cat-id: [email protected] joinBy "||" 
      ,primary-flag:$.primary[0] default "false" 
      ,(field3:[email protected][0]) when ($.primary[0] contains "true") 
     } 
    ) 
}) distinctBy $ 
) 

es erzeugt die Ausgabe wie:

product-id,cat-id,primary,field3 
D711069,DANIEL_4160||4160||DANIEL_4160,true,DANIEL_4160 

Eingabe verwendet:

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
<category-assignment product-id="D711069" category-id="DANIEL_4160"/> 
<category-assignment product-id="D711069" category-id="4160"> 
    <primary>true</primary> 
</category-assignment> 
<category-assignment product-id="D711069" category-id="DANIEL_4160"/> 
</catalog> 

HTH

+0

früher habe ich das gleiche implementiert, aber dieser Code schlägt für die Eingabe wie' Wahr ' –

+0

@RohanShinde, mit dem richtigen Code aktualisiert, versehentlich eingefügt die sa ich Stück Code zuvor. –