【问题标题】:Looping using dataweave使用数据编织循环
【发布时间】:2022-04-21 16:50:34
【问题描述】:

我的输入 xml:

  <Root>
     <Element>
         <Record att="a">value</Record>
         <Record att="b">value</Record>
           .
           .
          <Record att="g">value</Record>
          <Record att="h">value</Record>
            .
             .
          <Record att="p">value</Record>
            .
            .
          <Record att="t">value</Record>
              .
              .
          <Record att="w">value</Record>
               .
                .
          <Record att="z">value</Record>
     </Element>
     <Element>
         <Record att="a">value</Record>
         <Record att="b">value</Record>
           .
           .
          <Record att="g">value</Record>
          <Record att="h">value</Record>
            .
             .
          <Record att="p">value</Record>
            .
            .
          <Record att="t">value</Record>
              .
              .
          <Record att="w">value</Record>
               .
                .
          <Record att="z">value</Record>
     </Element>
     .
     .
     .
     .
     .
     .
   </Root>

我试过的dataweave配置:

   %dw 1.0
   %input payload application/xml
   %output application/csv

  ---
  payload.root.*Element[0].*Record map {
    (id:$.@att) when ($.@att) == "g" or ($.@att) == "t", 
    (type:($.@att) when ($.@att) == "g" or ($.@att) == "t"
  }

我在 csv 中得到的 o/p:

  id,type (headers)
  blanklines
  .
  .
  .
  g,g
  .
  .
  .
  .
  t,t
  .
  .

要求很明确。我只需要 Element[0] 的记录。我的 o/p CSV 不应该有任何空行。 预期输出应该是:

    id,type
    g,g
    t,t

我仍然无法理解 dataweave 循环的语法和概念。请帮帮我。接受任何更好的解决方案。

【问题讨论】:

    标签: csv mule mule-studio dataweave


    【解决方案1】:

    如果你不使用下标,它指的是第一个元素。您可以尝试删除下标[0]

    %dw 1.0
    %input payload application/xml
    %output application/csv 
    ---
    payload.Root.*Element.*Record map {
        (id:$.@att) ,
        (type:$.@att)
    } filter 
    

    【讨论】:

      【解决方案2】:

      您如何访问不在您的 XML 中的名称属性 (@name)? 您应该访问“att”属性对吗? (@att)

      您发布了正确的代码和 XML 吗?

      好的,这应该可以为您完成工作。

      %dw 1.0
      %input payload application/xml
      %output application/csv 
      ---
      payload.Root.*Element[0].*Record map {
      (id:$.@att) ,
      (type:$.@att)
      } filter ($.id == "g" or $.type == "t")
      

      【讨论】:

      • 我已经根据输入 XML 更改了我的 dataweave 代码
      • @masettimanikanta 请报告这是否对您有用,并标记为已回答,以便我们知道!
      【解决方案3】:

      script-:1(如果你想在 @att == g 或 t 的情况下只提取第一个位置的对象值)

         %dw 2.0
         input payload application/xml
         output application/csv
      
        ---
        payload.Root.*Element[0].*Record filter( ["t","g"] contains  $.@att) map{
            "id" : $.@att,
            "type" : $.@att
        }
      

      输出:-

      id,type
      g,g
      t,t
      

      script-:2(如果你想在@att == g 或 t 的情况下提取所有对象值)

       %dw 2.0
         input payload application/xml
         output application/csv
      
        ---
        payload.Root.*Element.*Record filter( ["t","g"] contains  $.@att) map{
            "id" : $.@att,
            "type" : $.@att
        }
      

      输出:-

      id,type
      g,g
      t,t
      g,g
      t,t
      

      【讨论】:

        【解决方案4】:

        下面的代码可以正常工作

        Weave Code
        %dw 1.0
        %output application/csv
        ---
        payload.Root.*Element[0].*Record filter (($.@att == 'g') or ($.@att == 't')) map {
            (id : $.@att),
            (type : $.@att)
        } 
        

        输出

        id,type
        g,g
        t,t
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-11
          • 2016-09-10
          • 1970-01-01
          • 1970-01-01
          • 2018-07-28
          相关资源
          最近更新 更多