【问题标题】:How to read an XML element into a variable with Azure Data Factory如何使用 Azure 数据工厂将 XML 元素读入变量
【发布时间】:2021-04-28 13:44:31
【问题描述】:

我正在尝试使用 Azure 数据工厂从 API 读取数据。首先,我需要调用一个提供 XML 响应的登录方法。我需要从该 XML 中获取一个元素并将其放入我的下一个 API 调用中以获取我需要的数据。

目前我正在使用复制数据工具来调用登录方法并将 XML 保存到 blob 存储。我现在如何将该 XML 的元素读入变量中?

如果有更好的方法,请指教,但我仍然想知道如何将 XML 元素读入变量。

编辑:这里是返回的 XML。我需要捕获 SessionID。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <DoLoginResponse xmlns="http://foo.bar">
            <DoLoginResult>
                <OperationStatus>true</OperationStatus>
                <StatusMessage />
                <SecurityProfile>
                    <User></User>
                    <Session>
                        <SessionId>d2cf6ea6-120f-4bff-a5d1-adad9063d9d2</SessionId>
                    </Session>
                    <IsFirstLogon>true</IsFirstLogon>
                    <IsSystemOwner>false</IsSystemOwner>
                </SecurityProfile>
            </DoLoginResult>
        </DoLoginResponse>
    </soap:Body>
</soap:Envelope>

【问题讨论】:

  • 是否要将xml文件的一部分提取到字符串变量中?
  • 您能给我们展示一些示例数据以及您要提取的部分吗?
  • 我认为 ADF 不支持这样处理 XML 内联。一种想法是将 XML 有效负载传递给 Azure 函数,该函数对其进行解析并将其作为 JSON 返回,这将很容易读取到变量中。

标签: xml azure-data-factory


【解决方案1】:

解决方案 1:

我最终通过使用查找活动来完成它,该活动获取连接 HTTP 链接服务的 XML 数据集。返回的 XML 以 json 对象的形式从活动输出,该对象通常可以通过 activity('GetSessionID').output.etc 访问。但是,某些元素名称包含冒号(soap:Envelope 和 soap:Body),当我将它们作为动态内容放入时,Azure 数据工厂给了我一个“BadRequest”错误。为了解决这个问题,我将它转换为 XML,转换为字符串,去掉冒号,转换回 xml,然后转换为 json。从那里我可以像往常一样访问该物业。这是给我会话 id 的动态内容:

@json(xml(replace(string(xml(activity('GetSessionID').output.firstRow)), ':', ''))).Envelope.Body.DoLoginResponse.DoLoginResult.SecurityProfile.Session.SessionId


解决方案 2:

我认为将xml文件的一部分提取到字符串变量中是可以的。我的想法是将xml文件转成字符串,根据表达式动态提取SessionId部分。

我在这里创建了一个简单的测试:

  1. 我正在使用查找活动来获取 xml 文件,您应该替换为您的网络活动。我声明了 2 个字符串变量 XMLStringSessionId

  2. Set variable1活动中,添加动态内容@string(activity('Lookup1').output.value[0])为变量XMLString赋值。如果您使用 Web 活动,则内容应为 @string(activity('&lt;Web_Actvity_Name&gt;').output)

  3. Set variable2活动中,添加动态内容@substring(variables('XMLString'),add(indexof(variables('XMLString'),'SessionId'),12),sub(indexof(variables('XMLString'),'}'),add(lastindexof(variables('XMLString'),'SessionId'),13)))为变量SessionId赋值。 SessionId的值如下:

【讨论】:

    【解决方案2】:

    我最终通过使用查找活动来完成它,该活动获取连接 HTTP 链接服务的 XML 数据集。返回的 XML 作为 json 对象从活动输出,通常可以使用activity('GetSessionID').output.etc 访问。但是,某些元素名称包含冒号(soap:Envelope 和 soap:Body),当我将它们作为动态内容放入时,Azure 数据工厂给了我一个“BadRequest”错误。为了解决这个问题,我将它转换为 XML,转换为字符串,去掉冒号,转换回 xml,然后转换为 json。从那里我可以像往常一样访问该物业。这是给我会话 id 的动态内容:@json(xml(replace(string(xml(activity('GetSessionID').output.firstRow)), ':', ''))).Envelope.Body.DoLoginResponse.DoLoginResult.SecurityProfile.Session.SessionId

    【讨论】:

    • 嗨@jazzabeanie 你的解决方案很棒。我将其添加到我的答案中。这可能对其他社区成员有益。
    猜你喜欢
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多