【问题标题】:How to access a multi value XML containing a json string如何访问包含 json 字符串的多值 XML
【发布时间】:2021-08-03 07:55:53
【问题描述】:

我在多值 xml 标记中有一个 json 字符串,我正在努力访问它。我想连接 "pid" 值以获得类似

"listOfPids" : "0000444, 0000111"

<xml>

<custom-attributes>
    <custom-attribute attribute-id="status">
        <value>{
                    "order":"000123"
                }
        </value>
        <value>{
            "prodId": "01010101",
            "status": [
                {
                    "package": "1234",
                    "products": [
                        {
                            "pid": "0000444",
                            "amount": "2"
                        }
                    ]
                },
                {
                    "package": "6789",
                    "products": [
                        {
                            "pid": "0000111",
                            "amount": "5"
                        }
                    ]
                }
            ]
}
        </value>
    </custom-attribute>
</custom-attributes>    
</xml>

我至少要获得第一个值并尝试读取和展平,但没有让它工作......

listOfPids: read(flatten((payload.xml."custom-attributes".*"custom-attribute") filter ($.@"attribute-id" == "status"))[1].value default "", "application/json").status[0].products[0].pid

【问题讨论】:

    标签: mule-studio dataweave anypoint-studio mulesoft


    【解决方案1】:

    您输入的值标签似乎与包含您感兴趣的 json 的值标签不一致。尝试使用以下答案中提到的那个:

    输入

    <?xml version="1.0" encoding="UTF-8"?>
    <custom-attributes>
            <custom-attribute attribute-id="status">
                <value>{
                        "order":"000123"
                    }
            </value>
                <value>
                {
        "prodId": "01010101",
        "status": [{
                "package": "1234",
                "products": [{
                    "pid": "0000444",
                    "amount": "2"
                }]
            },
            {
                "package": "6789",
                "products": [{
                    "pid": "0000111",
                    "amount": "5"
                }]
            }
        ]
    }
            </value>
            </custom-attribute>
    </custom-attributes>
    

    脚本

    %dw 2.0
    output json
    input payload xml
    ---
    
    listOfPids:(read((payload."custom-attributes"."custom-attribute")[1],"applciation/json").status..products..pid) joinBy ","
    

    输出

    {
      "listOfPids": "0000444,0000111"
    }
    

    【讨论】:

      【解决方案2】:

      这将是动态的,因为可能有更多具有 pid 值的值对象,只要它们处于相同的结构中,此脚本就会将它们全部连接起来

      %dw 2.0
      output application/json
      
      var objectValues = payload.xml.'custom-attributes'.'custom-attribute'.*value
      
      fun convertObjectsToDw(arr: Array<String>) = arr map (objectString) -> read(objectString)
      ---
      {
          listOfPids: ((convertObjectsToDw(objectValues))..status..products..pid) joinBy  ", "
      }
      

      【讨论】:

        【解决方案3】:
        %dw 2.0
        output application/json
        ---
        listOfPids: (
            payload..*value map read($, "application/json")
        )..pid joinBy ","
        

        我认为这更具可读性且不那么复杂。只要键值始终只有 JSON 字符串,您可以选择所有它们,然后将它们映射成结构化的 JSON 对象,然后选择所有 pid 值并加入它们。

        这还有一个优点,即无论 XML 文档的深度如何,或者如果结构发生变化(如答案示例之一),它只会提取每个名为 value 的键并提取 pid。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-14
          • 1970-01-01
          • 1970-01-01
          • 2013-05-17
          • 1970-01-01
          • 2019-04-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多