我现在如何将 XML 的元素读入变量

How do I now read an element of that XML into a variable

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

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

如果有更好的方法,请指教,但我仍然想知道如何将 XML 元素读入变量。 我需要传递 sp id,mac_add,接口作为调用下一个 api 的输入,同时将以 json 格式加载其他文件

这里是 xml

<?xml version="1.0" encoding="UTF-8"?>
<anp:anp_sp_list xmlns:anp="http://www.soap.com" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1" 
  xsi:schemaLocation="http://www.soap.com anp_sp_list.xsd">
  <sp id="5152">
  <controller_id>107</controller_id>
  <folder id="1">Top</folder>
  <group id="7">Cisco AP</group>
  <mac_add>45:2B:01:DB:FA:S6</mac_add>
  <mfgr>Cisco</mfgr>
  <model id="264">WEN</model>
    <id index="1">
     <antenna />
     <antenna_gain />
     <enabled>true</enabled>
     <operational_mode>n</operational_mode>
     <interface>0</interface>
    </id>
    <id index="2">
     <antenna />
     <antenna_gain />
     <enabled>true</enabled>
     <operational_mode>N</operational_mode>
     <interface>1</interface>
     </id>
     <id index="3">
     <antenna />
     <antenna_gain />
     <enabled>true</enabled>
     <operational_mode>n</operational_mode>
     <interface>2</interface>
  </id>
 </sp>
   <sp id="5251">
  <controller_id>07</controller_id>
  <folder id="1">Top</folder>
  <group id="7">AP</group>
  <mac_add>99:2B:01:DB:AF:S6</mac_add>
  <mfgr>sco</mfgr>
  <model id="264">WEN</model>
  <id index="3">
     <antenna />
     <antenna_gain />
     <enabled>true</enabled>
     <operational_mode>n</operational_mode>
     <interface>1</interface>
  </id>
  <id index="5">
     <antenna />
     <antenna_gain />
     <enabled>true</enabled>
     <operational_mode>N</operational_mode>
     <interface>4</interface>
  </id>
  <id index="3">
     <antenna />
     <antenna_gain />
     <enabled>true</enabled>
     <operational_mode>n</operational_mode>
     <interface>8</interface>
  </id>
 </sp>
</anp:anp_sp_list>

可以使用常用的点和数组语法从核心 Azure 数据工厂 (ADF) 中的 XML 查询值。在我的简单示例中,我在数据湖中有一个文件,我通过查找将其加载到管道中。然后我使用以下表达式从 xml 中获取值:

设置变量spId

@string(activity('Lookup1').output.firstRow['anp:anp_sp_list'].sp[0]['@id'])

设置变量varMac

@string(activity('Lookup1').output.firstRow['anp:anp_sp_list'].sp[0].mac_add)

设置变量varInterface

@string(activity('Lookup1').output.firstRow['anp:anp_sp_list'].sp[0].id[0].interface)

这适用于简单的 xml。在这里,我使用 [0] 语法获取第一个 sp 元素和第一个 interface 元素。请注意 xml 属性的 @ 语法。问题是你的样本 XML 有多个 sp 属性,它们又有多个 id 元素(其中包含 interface 元素),所以我认为你需要成为一个您的预期结果更清楚一些。可以使用 For Each activity 来遍历多个 sp 元素,但是您需要一个子包来再次遍历内部 ID。您最好将 xml 转换为平面 .csv 并在查找中使用它。

如果在 ADF 中做起来太复杂,您可以将问题传递给其他计算,例如 Azure SQL DB 非常适合 XML,或者使用 Databricks Notebooks 甚至映射数据流以获得低代码体验。 Azure SQL 数据库中使用其内置 XML 功能的一个简单示例:

;WITH XMLNAMESPACES ( 'http://www.soap.com' AS anp )
SELECT
    sp.c.value('(@id)[1]', 'INT') spId,
    sp.c.value('(mac_add)[1]', 'VARCHAR(30)') mac_add,
    id.c.value('(@index)[1]', 'INT') idIndex,
    id.c.value('(interface)[1]', 'VARCHAR(30)') interface
FROM @xml.nodes('anp:anp_sp_list/sp') sp(c)
    CROSS APPLY sp.c.nodes('id') id(c)
ORDER BY spId, idIndex;

我的结果:

如果您打算使用 For Each activity,您可以将以下表达式传递到“设置”>“项目”部分:

@activity('Lookup1').output.firstRow['anp:anp_sp_list'].sp

显然根据您的要求调整 activity 名称。这将允许您使用与上面类似的表达式访问 XML,例如

@string(item()['@id'])

@string(item().mac_add)