簡體   English   中英

我現在如何將 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,interface 作為輸入來調用下一個 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活動循環遍歷多個sp元素,但您需要一個子 package 再次循環遍歷內部 id。 您最好將 xml 轉換為 flat.csv 並在查找中使用它。

如果在 ADF 中執行起來太復雜,您可以將問題轉移到其他一些計算上,例如 Azure SQL DB 非常有能力使用 XML 數據流或用於低經驗數據。 Azure SQL DB 中使用其內置 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;

我的結果:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM