首页 > 解决方案 > 从xml转换时获取可用的Json

问题描述

我很难从已从 XML 自动转换的 JSON 中获取数据,我希望获得专业知识来确定实现目标的最佳方式。

我有一条从 restful 服务中读取的 xml 消息。我在帖子底部包含了 xml 消息的缩短匿名版本以供参考。消息是关于一个人的详细信息,一个人可以有多个地址。每个地址可以有 0 到 6 个地址行,如果地址行值没有填写,系统不会将它们包含在 xml 文档中。

我使用 json() 函数将其转换为 Json。然后我解析 json 以使值易于访问。

这是我遇到问题的地方。

当我使用 json() 函数将消息转换为 Json 时,我得到以下 Json 模式(见帖子底部)。请注意,地址不是数组格式,实际上都不是。

我不确定如何以适用于不是此特定消息的其他 PersonMessageService 消息的方式从中提取值。

我的问题是:

XML 消息

<PersonMessageService version="1.5.3">
<response timestamp="2020-03-31T08:48:42.273557+01:00">
    <status>SUCCESS</status>
    <description/>
    <receipt>A227C1E61EFA2B05E8530100007F6E90</receipt>
</response>
<payload>
    <PersonData>
        <MessageMeta>
            <messageId>123456</messageId>
            <MessageChecksum>c7875a0fd6869bb1234c82bd00712345</MessageChecksum>
        </MessageMeta>
        <personRecord SystemKey="123456789" timestamp="2020-01-31T08:48:35">
            <GUID>9889898</GUID>
            <idNumber>3578951</idNumber>
            <firstName>Joe</firstName>
            <surname>Bloggs</surname>
            <title>Mr</title>
            <gender>M</gender>
            <dateOfBirth>1980-01-01</dateOfBirth>
            <homeAddress addressObjectId="10001" timestamp="2018-11-12T14:58:01">
                <address>
                    <addressLine1>123 Fake St</addressLine1>
                    <country>United States</country>
                </address>
                <email>Joe@bloggs.com</email>
                <mobile>5558878558</mobile>
            </homeAddress>
            <termAddress addressObjectId="10002" timestamp="2018-11-12T15:07:01">
                <address/>
                <email>joebloggs@hotmail.com</email>
            </termAddress>
            <workAddress addressObjectId="10003" timestamp="2018-11-12T15:07:01">
                <address/>
            </workAddress>
            <mailingLabel addressObjectId="10004" timestamp="2018-11-12T14:58:01">
                <address>
                    <addressLine1>58 Fake Bvd</addressLine1>
                    <addressLine2>Fake County</addressLine2>
                    <country>United States</country>
                </address>
            </mailingLabel>
            <referenceNumbers/>
            <personIndicators>
                <country/>
                <nationality/>
                <marketingCorrespondence>N</marketingCorrespondence>
            </personIndicators>
        </personRecord>
    </PersonData>
</payload>

使用 JSON() 函数自动转换为 JSON 后

{
  "PersonMessageService": {
    "@version": "1.5.3",
    "response": {
      "@timestamp": "2020-03-31T08:48:42.273557+01:00",
      "status": "SUCCESS",
      "description": null,
      "receipt": "A227C1E61EFA2B05E8530100007F6E90"
    },
    "payload": {
      "PersonData": {
        "MessageMeta": {
          "messageId": "123456",
          "MessageChecksum": "c7875a0fd6869bb1234c82bd00712345"
        },
        "personRecord": {
          "@SystemKey": "123456789",
          "@timestamp": "2020-01-31T08:48:35",
          "GUID": "9889898",
          "idNumber": "3578951",
          "firstName": "Joe",
          "surname": "Bloggs",
          "title": "Mr",
          "gender": "M",
          "dateOfBirth": "1980-01-01",
          "homeAddress": {
            "@addressObjectId": "10001",
            "@timestamp": "2018-11-12T14:58:01",
            "address": {
              "addressLine1": "123 Fake St",
              "country": "United States"
            },
            "email": "Joe@bloggs.com",
            "mobile": "5558878558"
          },
          "termAddress": {
            "@addressObjectId": "10002",
            "@timestamp": "2018-11-12T15:07:01",
            "address": null,
            "email": "joebloggs@hotmail.com"
          },
          "workAddress": {
            "@addressObjectId": "10003",
            "@timestamp": "2018-11-12T15:07:01",
            "address": null
          },
          "mailingLabel": {
            "@addressObjectId": "10004",
            "@timestamp": "2018-11-12T14:58:01",
            "address": {
              "addressLine1": "58 Fake Bvd",
              "addressLine2": "Fake County",
              "country": "United States"
            }
          },
          "referenceNumbers": null,
          "personIndicators": {
            "country": null,
            "nationality": null,
            "marketingCorrespondence": "N"
          }
        }
      }
    }
  }
}

标签: jsonxmlazure-logic-apps

解决方案


你不会从自动转换器中得到比这更好的东西——事实上我认为它做得很好。

进行比这更好的转换需要人类智能,特别是对数据模型的理解。但这意味着为 XML 的各个部分定义您自己的转换规则。您可以使用 XSLT 轻松实现这一目标。新的数据类型和 JSON 序列化方法使 XSLT 3.0 更容易做到这一点,但也可以在 1.0 或 2.0 中完成,只是需要更多的努力。


推荐阅读