如何在mule中将扩展CSV转换为XML

时间:2017-02-03 10:31:04

标签: mule dataweave

我必须阅读包含6种不同结构格式的CSV文件并转换为XML格式。我需要帮助来阅读mule中的多结构化CSV文件。

示例输入:

  

01,12345,帽子,2017年1月2日
  02,12345,subject1,subject2,subject3,subject4,subject5
  03,12345,65432,45,ABS
  04,12345,ABC,DEF ,,
  05,12345,5325,ABC,
  06,12345,87.9,航空自卫队,LKJ
  06,12345,99,ABC,WERT

预期产出:

<Root>
  <Sample>
    <Number>12345</Number>
    <B>Cap</B>
    <C>01-02-2017</C>
  </Sample>
  <Example>
    <Sub>
      <Number>12345</Number>
      <S1>subject1</S1>
      <S2>subject2</S2>
      <S3>subject3</S3>
      <S4>subject4</S4>
      <S5>subject5</S5>
    </Sub>
    <Sub1>
      <Number>12345</Number>
      <A1>65432</A1>
      <A2>45</A2>
      <A3>ABS</A3>
   </Sub1>
   <Sub2>
     <Number>12345</Number>
     <B1>ABC</B1>
     <B2>DEF</B2>
     <B3/>
   </Sub2>
   <Sub3>
     <Number>12345</Number>
     <C1>5325</C1>
     <C2>ABC</C2>
   </Sub3>
   <Sub4>
    <Sub_rec>
      <Number>12345</Number>
      <D1>87.9</D1>
      <D2>ASDF</D2>
      <D3>LKJ</D3>
    </Sub_rec>
    <Sub_rec>
      <Number>12345</Number>
      <D1>99</D1>
      <D2>ABC</D2>
      <D3>WERT</D3>
    </Sub_rec>
  </Sub4>
 </Example>
</Root>

1 个答案:

答案 0 :(得分:0)

假设数据不会改变,则dataweave转换为

%dw 1.0
%output application/xml
---
root: {
    sample: {
        Number: payload[0][0]
    },
    Example: {
        sub : {
            Number: payload[1][0]
        },
        sub1 : {
            Number: payload[2][0]
        },
        sub2 : {
            Number: payload[3][0]
        },
        sub3 : {
            Number: payload[4][0]
        },
        sub4 : {
            Sub_rec: {
                Number: payload[5][0]
            },
            Sub_rec: {
                Number: payload[6][0]
            }
        }
    }
}

可以使用S1: payload[1][3]等来填充其他值。

第二种方法是使用map,虽然它也假设数据是静态的,更灵活的

root: {
    sample: {
        Number: payload[0][0]
    },
    Example: {
        (payload[1..-2] map ((row, indexOfRow) -> {
            Sub : {
                Number: row[0]
            } when indexOfRow == 0
            otherwise {
                Number: row[0]
            } when indexOfRow == 1
            otherwise {
                Number: row[0]
            } when indexOfRow == 2
            otherwise {
                Number: row[0]
            } when indexOfRow == 3
                otherwise {
                    (payload[-2..-1] map {
                        sub_rec: {
                            Number: $[2]
                        }
                })
            }
        }))
    }
}