Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mule 使用dataweave 2进行XML解析以转换json_Mule_Dataweave - Fatal编程技术网

Mule 使用dataweave 2进行XML解析以转换json

Mule 使用dataweave 2进行XML解析以转换json,mule,dataweave,Mule,Dataweave,我正在尝试使用Dataweave2递归解析XML以创建JSON数组,但我无法做到这一点 下面给出了我的输入XML- <?xml version="1.0" encoding="utf-16"?> <MessageParts xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message"> <BillsOfMaterials

我正在尝试使用Dataweave2递归解析XML以创建JSON数组,但我无法做到这一点

下面给出了我的输入XML-

<?xml version="1.0" encoding="utf-16"?>
<MessageParts xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
  <BillsOfMaterials xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/BillsOfMaterials">
    <SenderId>121</SenderId>
    <BOMVersion class="entity">
      <BOMId>BOM0012605</BOMId>
      <ItemId>9650084</ItemId>
      <ItemIdCommercial></ItemIdCommercial>
      <Name>SmartRip for Folding Carton</Name>
      <RecId>5637161103</RecId>
      <BOMTable class="entity">
        <BOMId>BOM0012605</BOMId>
        <Name>SmartRip for Folding Carton</Name>
        <RecId>5637160354</RecId>
        <BOM class="entity">
          <BOMId>BOM0012605</BOMId>
          <BOMQty>1.0000</BOMQty>
          <BOMType>Item</BOMType>
          <ItemId>9650092</ItemId>
          <RecId>5637307757</RecId>
          <UnitId>PCS</UnitId>
          <InventDimBOM class="entity">
            <RecId>5637213290</RecId>
          </InventDimBOM>
          <BOMTable>
            <BOMId>BOM0012613</BOMId>
            <Name>FlexRip Classic Intel kernel and tools</Name>
            <RecId>5637161355</RecId>
            <BOM>
              <BOMType>Item</BOMType>
              <ItemId>9650079</ItemId>
              <BOMQty>1.00</BOMQty>
              <UnitId>PCS</UnitId>
              <BOMId>BOM0012613</BOMId>
              <RecId>5637307799</RecId>
            </BOM>
            <BOM>
              <BOMType>Item</BOMType>
              <ItemId>9644919T</ItemId>
              <BOMQty>1.00</BOMQty>
              <UnitId>PCS</UnitId>
              <BOMId>BOM0012613</BOMId>
              <RecId>5637307800</RecId>
            </BOM>
            <BOM>
              <BOMType>Item</BOMType>
              <ItemId>9644920</ItemId>
              <BOMQty>1.00</BOMQty>
              <UnitId>PCS</UnitId>
              <BOMId>BOM0012613</BOMId>
              <RecId>5637307801</RecId>
            </BOM>
            <BOM>
              <BOMType>Item</BOMType>
              <ItemId>9700720Z</ItemId>
              <BOMQty>1.00</BOMQty>
              <UnitId>PCS</UnitId>
              <BOMId>BOM0012613</BOMId>
              <RecId>5637307802</RecId>
              <BOMTable>
                <BOMId>BOM012173</BOMId>
                <Name></Name>
                <RecId>5637157832</RecId>
                <BOM>
                  <BOMType>Item</BOMType>
                  <ItemId>9700595</ItemId>
                  <BOMQty>1.00</BOMQty>
                  <UnitId>PCS</UnitId>
                  <BOMId>BOM012173</BOMId>
                  <RecId>5637333626</RecId>
                </BOM>
              </BOMTable>
              <BOMTable>
                <BOMId>BOM012173</BOMId>
                <Name></Name>
                <RecId>5637157832</RecId>
                <BOM>
                  <BOMType>Item</BOMType>
                  <ItemId>9700595</ItemId>
                  <BOMQty>1.00</BOMQty>
                  <UnitId>PCS</UnitId>
                  <BOMId>BOM012173</BOMId>
                  <RecId>5637333626</RecId>
                </BOM>
                <BOM>
                  <BOMType>Item</BOMType>
                  <ItemId>9608224Z</ItemId>
                  <BOMQty>1.00</BOMQty>
                  <UnitId>PCS</UnitId>
                  <BOMId>BOM012173</BOMId>
                  <RecId>5637333627</RecId>
                </BOM>       
              </BOMTable>
            </BOM>
            <BOM>
              <BOMType>Item</BOMType>
              <ItemId>9683336L</ItemId>
              <BOMQty>1.00</BOMQty>
              <UnitId>PCS</UnitId>
              <BOMId>BOM0012613</BOMId>
              <RecId>5637307803</RecId>
              <BOMTable>
                <BOMId>BOM0012781</BOMId>
                <Name>Esko Suite 12.1 A5 Software box</Name>
                <RecId>5637165603</RecId>
                <BOM>
                  <BOMType>Item</BOMType>
                  <ItemId>G211249</ItemId>
                  <BOMQty>1.00</BOMQty>
                  <UnitId>PCS</UnitId>
                  <BOMId>BOM0012781</BOMId>
                  <RecId>5637309242</RecId>
                </BOM>
              </BOMTable>
              <BOMTable>
                <BOMId>BOM0012781</BOMId>
                <Name>Esko Suite 12.1 A5 Software box</Name>
                <RecId>5637165603</RecId>
                <BOM>
                  <BOMType>Item</BOMType>
                  <ItemId>G211249</ItemId>
                  <BOMQty>1.00</BOMQty>
                  <UnitId>PCS</UnitId>
                  <BOMId>BOM0012781</BOMId>
                  <RecId>5637309242</RecId>
                </BOM>
                <BOM>
                  <BOMType>Item</BOMType>
                  <ItemId>G25583961_24</ItemId>
                  <BOMQty>1.00</BOMQty>
                  <UnitId>PCS</UnitId>
                  <BOMId>BOM0012781</BOMId>
                  <RecId>5637309243</RecId>
                </BOM>
              </BOMTable>
            </BOM>
          </BOMTable>
        </BOM>
        <BOM class="entity">
          <BOMId>BOM0012605</BOMId>
          <BOMQty>1.0000</BOMQty>
          <BOMType>Item</BOMType>
          <ItemId>9608221Z</ItemId>
          <RecId>5637307758</RecId>
          <UnitId>PCS</UnitId>
          <InventDimBOM class="entity">
            <RecId>5637213290</RecId>
          </InventDimBOM>
        </BOM>
        <BOM class="entity">
          <BOMId>BOM0012605</BOMId>
          <BOMQty>1.0000</BOMQty>
          <BOMType>Item</BOMType>
          <ItemId>9700624Y</ItemId>
          <RecId>5637307759</RecId>
          <UnitId>PCS</UnitId>
          <InventDimBOM class="entity">
            <RecId>5637213291</RecId>
          </InventDimBOM>
          <BOMTable>
            <BOMId>BOM012172</BOMId>
            <Name></Name>
            <RecId>5637157831</RecId>
            <BOM>
              <BOMType>Item</BOMType>
              <ItemId>9644921</ItemId>
              <BOMQty>1.00</BOMQty>
              <UnitId>PCS</UnitId>
              <BOMId>BOM012172</BOMId>
              <RecId>5637333624</RecId>
            </BOM>
          </BOMTable>
        </BOM>
        <BOM class="entity">
          <BOMId>BOM0012605</BOMId>
          <BOMQty>1.0000</BOMQty>
          <BOMType>Item</BOMType>
          <ItemId>9700815</ItemId>
          <RecId>5637307760</RecId>
          <UnitId>PCS</UnitId>
          <InventDimBOM class="entity">
            <RecId>5637213290</RecId>
          </InventDimBOM>
        </BOM>
      </BOMTable>
      <InventDim class="entity">
        <RecId>5637199988</RecId>
      </InventDim>
    </BOMVersion>
  </BillsOfMaterials>
</MessageParts>
映射规则-

  • id:BOM->RecId
  • productId:BOM->ItemId
  • parentId:父BOM表的RecId

  • 与建议答案的不同之处在于,我需要使用BOM的即时recid而不是BOM表的即时recid设置parentid。

    鉴于输入,您的输出似乎仍然是错误的(例如,输入xml中没有产品id 96AR060W)。要回答您的问题,您可以遍历各个BOM表对象来保存父id,并创建一个可以递归调用的函数,而不是收集所有BOM表对象。请参阅以下资料:

    %dw 2.0
    output application/json
    
    fun parseBOM(bomData, parentId) = 
        if (bomData.BOMTable.BOM?) 
            [{
                id: bomData.RecId,
                productId: bomData.ItemId,
                parentId: parentId  
            }] ++ (bomData.BOMTable.*BOM flatMap parseBOM($, bomData.RecId))
        else {
            id: bomData.RecId,
            productId: bomData.ItemId,
            parentId: parentId
        }
    
    ---
    using (firstBOMTable =  payload.MessageParts.BillsOfMaterials.BOMVersion.BOMTable)
    firstBOMTable.*BOM flatMap parseBOM($, null)
    
    给定您的输入xml,这将导致

    [
      {
        "id": "5637307757",
        "productId": "9650092",
        "parentId": null
      },
      {
        "id": "5637307799",
        "productId": "9650079",
        "parentId": "5637307757"
      },
      {
        "id": "5637307800",
        "productId": "9644919T",
        "parentId": "5637307757"
      },
      {
        "id": "5637307801",
        "productId": "9644920",
        "parentId": "5637307757"
      },
      {
        "id": "5637307802",
        "productId": "9700720Z",
        "parentId": "5637307757"
      },
      {
        "id": "5637333626",
        "productId": "9700595",
        "parentId": "5637307802"
      },
      {
        "id": "5637333627",
        "productId": "9608224Z",
        "parentId": "5637307802"
      },
      {
        "id": "5637307803",
        "productId": "9683336L",
        "parentId": "5637307757"
      },
      {
        "id": "5637309242",
        "productId": "G211249",
        "parentId": "5637307803"
      },
      {
        "id": "5637309243",
        "productId": "G25583961_24",
        "parentId": "5637307803"
      },
      {
        "id": "5637307758",
        "productId": "9608221Z",
        "parentId": null
      },
      {
        "id": "5637307759",
        "productId": "9700624Y",
        "parentId": null
      },
      {
        "id": "5637333624",
        "productId": "9644921",
        "parentId": "5637307759"
      },
      {
        "id": "5637307760",
        "productId": "9700815",
        "parentId": null
      }
    ]
    

    该函数的作用是,如果提供的对象(bomData)包含BOMTable.BOM,则创建所需的对象,并使用其下的所有BOM表对象再次调用同一函数。该函数还接受parentId作为参数来保留它。

    鉴于输入,您的输出似乎仍然是错误的(例如,产品id 96AR060W不在输入xml中)。要回答您的问题,您可以遍历各个BOM表对象来保存父id,并创建一个可以递归调用的函数,而不是收集所有BOM表对象。请参阅以下资料:

    %dw 2.0
    output application/json
    
    fun parseBOM(bomData, parentId) = 
        if (bomData.BOMTable.BOM?) 
            [{
                id: bomData.RecId,
                productId: bomData.ItemId,
                parentId: parentId  
            }] ++ (bomData.BOMTable.*BOM flatMap parseBOM($, bomData.RecId))
        else {
            id: bomData.RecId,
            productId: bomData.ItemId,
            parentId: parentId
        }
    
    ---
    using (firstBOMTable =  payload.MessageParts.BillsOfMaterials.BOMVersion.BOMTable)
    firstBOMTable.*BOM flatMap parseBOM($, null)
    
    给定您的输入xml,这将导致

    [
      {
        "id": "5637307757",
        "productId": "9650092",
        "parentId": null
      },
      {
        "id": "5637307799",
        "productId": "9650079",
        "parentId": "5637307757"
      },
      {
        "id": "5637307800",
        "productId": "9644919T",
        "parentId": "5637307757"
      },
      {
        "id": "5637307801",
        "productId": "9644920",
        "parentId": "5637307757"
      },
      {
        "id": "5637307802",
        "productId": "9700720Z",
        "parentId": "5637307757"
      },
      {
        "id": "5637333626",
        "productId": "9700595",
        "parentId": "5637307802"
      },
      {
        "id": "5637333627",
        "productId": "9608224Z",
        "parentId": "5637307802"
      },
      {
        "id": "5637307803",
        "productId": "9683336L",
        "parentId": "5637307757"
      },
      {
        "id": "5637309242",
        "productId": "G211249",
        "parentId": "5637307803"
      },
      {
        "id": "5637309243",
        "productId": "G25583961_24",
        "parentId": "5637307803"
      },
      {
        "id": "5637307758",
        "productId": "9608221Z",
        "parentId": null
      },
      {
        "id": "5637307759",
        "productId": "9700624Y",
        "parentId": null
      },
      {
        "id": "5637333624",
        "productId": "9644921",
        "parentId": "5637307759"
      },
      {
        "id": "5637307760",
        "productId": "9700815",
        "parentId": null
      }
    ]
    

    该函数的作用是,如果提供的对象(bomData)包含BOMTable.BOM,则创建所需的对象,并使用其下的所有BOM表对象再次调用同一函数。该函数还接受parentId作为参数来保留它。

    “我不能这样做”不是一个问题描述。。。引用的代码是做什么的?为什么这是错误的或不够的?解释清楚。这能回答你的问题吗?Hi Aled,no,这并不能回答问题,问题是我需要将父BOM的RecId分配给子BOM。Hi下划线_d,我需要使用DWL 2从给定输入转换为给定输出。我面临的问题是实现递归来解析XML。
    %dw 2.0输出应用程序/json fun getLines(bom,parent)=if(bom.BOMTable.bom?{“id”:bom.RecId,“productId”:bom.ItemId,“parent”:parent}++getLines(bom.BOMTable.bom,bom.RecId)else{“id”:bom.RecId,“productId”:bom.ItemId,“parent”:parent}---payload.MessageParts.BillsOfMaterials.BOMVersion.BOMTable.*bom映射(val)->{(getLines(val,null))}
    “我不能这样做”不是问题描述。。。引用的代码是做什么的?为什么这是错误的或不够的?解释清楚。这能回答你的问题吗?Hi Aled,no,这并不能回答问题,问题是我需要将父BOM的RecId分配给子BOM。Hi下划线_d,我需要使用DWL 2从给定输入转换为给定输出。我面临的问题是实现递归来解析XML。
    %dw 2.0输出应用程序/json fun getLines(bom,parent)=if(bom.BOMTable.bom?{“id”:bom.RecId,“productId”:bom.ItemId,“parent”:parent}++getLines(bom.BOMTable.bom,bom.RecId)else{“id”:bom.RecId,“productId”:bom.ItemId,“parent”:parent}---payload.MessageParts.BillsOfMaterials.BOMVersion.BOMTable.*bom映射(val)->{(getLines(val,null))}