【问题标题】:How to loop inside loop for mapping to CSV from XML如何在循环内循环以从 XML 映射到 CSV
【发布时间】:2020-01-16 13:24:36
【问题描述】:
<?xml version="1.0"?>
<tXML>
  <Header>
    <Source>1</Source>
    <Action_Type>Update</Action_Type>
    <Sequence_Number>0</Sequence_Number>
    <Batch_ID>4</Batch_ID>
    <Reference_ID>043</Reference_ID>
    <User_ID>S</User_ID>
    <Password>password</Password>
    <Message_Type></Message_Type>
    <Company_ID>J1</Company_ID>
    <Msg_Locale>English (United States)</Msg_Locale>
    <Msg_Time_Zone>Eastern Standard Time</Msg_Time_Zone>
    <Version></Version>
    <Internal_Reference_ID></Internal_Reference_ID>
    <Internal_Date_Time_Stamp></Internal_Date_Time_Stamp>
    <External_Reference_ID></External_Reference_ID>
    <External_Date_Time_Stamp></External_Date_Time_Stamp>
  </Header>
  <Message>
    <DistributionOrder>
      <LineItem>
        <DoLineNbr>1</DoLineNbr>
        <ItemName>135465</ItemName>
        <Description>A</Description>
        <UpdateActionType></UpdateActionType>
        <PackageType></PackageType>
        <DoLineStatus>Released</DoLineStatus>
        <InventoryAttributes>
          <InventoryType>F</InventoryType>
          <ProductStatus></ProductStatus>
          <BatchNbr></BatchNbr>
          <CountryOfOrigin></CountryOfOrigin>
          <ItemAttribute1>R</ItemAttribute1>
          <ItemAttribute2></ItemAttribute2>
          <ItemAttribute3></ItemAttribute3>
          <ItemAttribute4></ItemAttribute4>
          <ItemAttribute5></ItemAttribute5>
        </InventoryAttributes>
        <Comment>
          <NoteType>MB</NoteType>
          <NoteCode>20</NoteCode>
          <CommentText>[JPY_ _Mens_ _ _ _ _ _ _ _ _ _ _ ]</CommentText>
          <Visibility>0</Visibility>
        </Comment>
        <Comment>
          <NoteType>MB</NoteType>
          <NoteCode>13</NoteCode>
          <CommentText>[ _00016000.00000_.00000_.00000_ _ _ _ _ _ _ _ ]</CommentText>
          <Visibility>0</Visibility>
        </Comment>
        <Comment>
          <NoteType>SC</NoteType>
          <NoteCode>02</NoteCode>
          <CommentText>[ _ _ _ _R]</CommentText>
          <Visibility>0</Visibility>
        </Comment>
      </LineItem>
      <LineItem>
        <DoLineNbr>2</DoLineNbr>
        <ItemName>4550155140404</ItemName>
        <Description>AS LAMBSWOOL VNECK</Description>
        <UpdateActionType></UpdateActionType>
        <PackageType></PackageType>
        <DoLineStatus>Released</DoLineStatus>
        <InventoryAttributes>
          <InventoryType>F</InventoryType>
          <ProductStatus></ProductStatus>
          <BatchNbr></BatchNbr>
          <CountryOfOrigin></CountryOfOrigin>
          <ItemAttribute1>R</ItemAttribute1>
          <ItemAttribute2></ItemAttribute2>
          <ItemAttribute3></ItemAttribute3>
          <ItemAttribute4></ItemAttribute4>
          <ItemAttribute5></ItemAttribute5>
        </InventoryAttributes>
        <Comment>
          <NoteType>MB</NoteType>
          <NoteCode>20</NoteCode>
          <CommentText>[JPY_ _Mens_ _ _ _ _ _ _ _ _ _ _ ]</CommentText>
          <Visibility>0</Visibility>
        </Comment>
        <Comment>
          <NoteType>MB</NoteType>
          <NoteCode>13</NoteCode>
          <CommentText>[ _00016000.00000_.00000_.00000_ _ _ _ _ _ _ _ ]</CommentText>
          <Visibility>0</Visibility>
        </Comment>
        <Comment>
          <NoteType>SC</NoteType>
          <NoteCode>02</NoteCode>
          <CommentText>[ _ _ _ _R]</CommentText>
          <Visibility>0</Visibility>
        </Comment>
        </LineItem>
    </DistributionOrder>
  </Message>
</tXML>

我的代码是这样的

%dw 2.0
output application/csv header = false , separator = "|" , quoteValues = false
---
payload.tXML.Message.*DistributionOrder map ((DistributionOrder , indexofDistributionOrder) ->  {
    column_1: "000000001",
    column_2: "0",
    column_3: "0",
    column_4: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "_")[0] replace "[" with "" default "",
    column_5: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "_")[1] replace "[" with "" default "",
    column_6: ????
    column_7: "",
    column_8: "",
    column_9: "",
    column_10: "",
})

所以在上面的代码中,我循环每个行项以获取字段,但在每个行项中,我必须为每个评论循环,并且对于每个评论,我需要将它放在不同的行中。例如,输出应如下所示,如您在示例中看到的,如果行项目 2 有 3 个评论部分,我有 3 行用于 3 cmets。

00000002|0001333006|20191220|34621|SAPTOMIF4|CommentText1|||6500055464123|252||J1||||MW09449| 
00000002|0001333006|20191220|34621|SAPTOMIF4|CommentText2|||6500055464123|252||J1||||MW09449| 
00000002|0001333006|20191220|34621|SAPTOMIF4|CommentText3|||6500055464123|252||J1||||MW09449|  
000000003|0001333006|20191220|34621|SAPTOMIF6|CommentText1|||6500055654123|4542||J1||||MW09449|
000000003|0001333006|20191220|34621|SAPTOMIF6|CommentText2|||6500055654123|4542||J1||||MW09449|
000000003|0001333006|20191220|34621|SAPTOMIF6|CommentText3|||6500055654123|4542||J1||||MW09449|
000000004|0001333006|20191220|34621|SAPTOMIF6||||65000545664123|35463||J1||||MW09449| 

【问题讨论】:

  • 对不起,我的代码看起来像这样循环 Line item level ``` %dw 2.0 output application/csv header = false , separator = "|" , quoteValues = false payload.tXML.Message.DistributionOrder.*LineItem map ((LineItem , indexofLineItem) -> { column_1: "000000001", column_2: "0", column_3: "0", column_4: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "")[0] 将 "[" 替换为 "" 默认 "",column_5: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "")[1] 将 "[" 替换为 "" 默认 "" ,column_6:??????column_7:“”,column_8:“”,column_9:“”,column_10:“”,})```
  • 您好,为了便于阅读,我已尝试对您的代码进行一些格式化。请根据需要查看并edit。您可能需要添加语言标签以突出显示代码的语法。也请将您的评论移至问题中;代码在 cmets 中不可读。或删除已过时的评论。另请参阅How to Ask

标签: dataweave mulesoft mule4


【解决方案1】:

您可以尝试在地图中执行地图。但是,如果您希望将结果对象写为 csv,则需要将其展平,因为它将生成数组中的数组。

参见下面的示例代码:

%dw 2.0
output application/csv header = false , separator = "|" , quoteValues = false

var payload = read("<tXML>
      <Header>
        <Source>1</Source>
        <Action_Type>Update</Action_Type>
        <Sequence_Number>0</Sequence_Number>
        <Batch_ID>4</Batch_ID>
        <Reference_ID>043</Reference_ID>
        <User_ID>S</User_ID>
        <Password>password</Password>
        <Message_Type></Message_Type>
        <Company_ID>J1</Company_ID>
        <Msg_Locale>English (United States)</Msg_Locale>
        <Msg_Time_Zone>Eastern Standard Time</Msg_Time_Zone>
        <Version></Version>
        <Internal_Reference_ID></Internal_Reference_ID>
        <Internal_Date_Time_Stamp></Internal_Date_Time_Stamp>
        <External_Reference_ID></External_Reference_ID>
        <External_Date_Time_Stamp></External_Date_Time_Stamp>
      </Header>
      <Message>
        <DistributionOrder>
          <LineItem>
            <DoLineNbr>1</DoLineNbr>
            <ItemName>135465</ItemName>
            <Description>A</Description>
            <UpdateActionType></UpdateActionType>
            <PackageType></PackageType>
            <DoLineStatus>Released</DoLineStatus>
            <InventoryAttributes>
              <InventoryType>F</InventoryType>
              <ProductStatus></ProductStatus>
              <BatchNbr></BatchNbr>
              <CountryOfOrigin></CountryOfOrigin>
              <ItemAttribute1>R</ItemAttribute1>
              <ItemAttribute2></ItemAttribute2>
              <ItemAttribute3></ItemAttribute3>
              <ItemAttribute4></ItemAttribute4>
              <ItemAttribute5></ItemAttribute5>
            </InventoryAttributes>
            <Comment>
              <NoteType>MB</NoteType>
              <NoteCode>20</NoteCode>
              <CommentText>[JPY_ _Mens_ _ _ _ _ _ _ _ _ _ _ ]</CommentText>
              <Visibility>0</Visibility>
            </Comment>
            <Comment>
              <NoteType>MB</NoteType>
              <NoteCode>13</NoteCode>
              <CommentText>[ _00016000.00000_.00000_.00000_ _ _ _ _ _ _ _ ]</CommentText>
              <Visibility>0</Visibility>
            </Comment>
            <Comment>
              <NoteType>SC</NoteType>
              <NoteCode>02</NoteCode>
              <CommentText>[ _ _ _ _R]</CommentText>
              <Visibility>0</Visibility>
            </Comment>
          </LineItem>
          <LineItem>
            <DoLineNbr>2</DoLineNbr>
            <ItemName>4550155140404</ItemName>
            <Description>AS LAMBSWOOL VNECK</Description>
            <UpdateActionType></UpdateActionType>
            <PackageType></PackageType>
            <DoLineStatus>Released</DoLineStatus>
            <InventoryAttributes>
              <InventoryType>F</InventoryType>
              <ProductStatus></ProductStatus>
              <BatchNbr></BatchNbr>
              <CountryOfOrigin></CountryOfOrigin>
              <ItemAttribute1>R</ItemAttribute1>
              <ItemAttribute2></ItemAttribute2>
              <ItemAttribute3></ItemAttribute3>
              <ItemAttribute4></ItemAttribute4>
              <ItemAttribute5></ItemAttribute5>
            </InventoryAttributes>
            <Comment>
              <NoteType>MB</NoteType>
              <NoteCode>20</NoteCode>
              <CommentText>[JPY_ _Mens_ _ _ _ _ _ _ _ _ _ _ ]</CommentText>
              <Visibility>0</Visibility>
            </Comment>
            <Comment>
              <NoteType>MB</NoteType>
              <NoteCode>13</NoteCode>
              <CommentText>[ _00016000.00000_.00000_.00000_ _ _ _ _ _ _ _ ]</CommentText>
              <Visibility>0</Visibility>
            </Comment>
            <Comment>
              <NoteType>SC</NoteType>
              <NoteCode>02</NoteCode>
              <CommentText>[ _ _ _ _R]</CommentText>
              <Visibility>0</Visibility>
            </Comment>
            </LineItem>
        </DistributionOrder>
      </Message>
    </tXML>", "application/xml")
---

flatten(payload.tXML.Message.DistributionOrder.*LineItem map (LineItem) -> 
    LineItem.*Comment map (Comment) ->
    {
        column_1: "000000001", 
        column_2: "0", 
        column_3: "0", 
        column_4: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "_")[0] replace "[" with "" default "", 
        column_5: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "_")[1] replace "[" with "" default "", 
        column_6: Comment.CommentText, 
        column_7: "", 
        column_8: "", 
        column_9: "", 
        column_10: ""
    })

这将导致

000000001|0|0|||[JPY_ _Mens_ _ _ _ _ _ _ _ _ _ _ ]||||
000000001|0|0|||[ _00016000.00000_.00000_.00000_ _ _ _ _ _ _ _ ]||||
000000001|0|0|||[ _ _ _ _R]||||
000000001|0|0|||[JPY_ _Mens_ _ _ _ _ _ _ _ _ _ _ ]||||
000000001|0|0|||[ _00016000.00000_.00000_.00000_ _ _ _ _ _ _ _ ]||||
000000001|0|0|||[ _ _ _ _R]||||

【讨论】:

猜你喜欢
  • 2011-03-05
  • 2019-12-11
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
相关资源
最近更新 更多