從Excel到Power Query:函數實戰系列(7)_細說Power Query的內建函數(以匯入xml檔案為例)

XML這類型的資料檔案是使用標記語言來描述資料,具有明確的層次結構,亦可以定義結構的模式(例如DTD或XSD),常廣泛應用於企業系統或資料交換。然而,與JSON相比,XML使用標籤而非符號結構,比較適合文件樣式的資料,雖然它更注重格式的可讀性,但比JSON更冗長。

在匯入XML檔案格式時,需要驗證XML的結構以及定義XML文件結構和規範,以確保資料的一致性。而在處理屬性與標籤中的資料要避免混淆。若XML檔案過於冗長,建議事先篩選重點及節點。

Xml.Tables()函數

在此範例中透過Power Query操作匯入XML檔案時,會執行3個操作步驟:

其中,第1個操作步驟便是Xml.Document()函數。

這是Power Query極為重要的內建函數,用於將XML格式的資料轉換為可供查詢的內部結構。其主要功能是解析XML文件檔案並返回一個階層式的記錄(Record),這便是一個標準的資料表結構,讓XML的資料容更容易地擷取和操作。函數裡的第1個參數是描述要讀取的csv檔案之完整路徑與檔案名稱,因此也常在此搭配另一個內建函數File.Contents( ) 。第2參數是可選用的encoding參數,此參數的作用是指定解析XM資料時所使用的編碼(encoding),它允許處理各種編碼的XML文件以確保資料正確解碼並解析成內部結構。例如 UTF-8 或其他文字符號編碼標準。如果此參數未指定,則 Power Query 會使用XML文件裡所宣告的編碼(通常定義在XML檔案的前面,例如 <?xml version="1.0" encoding="UTF-8"?>)作為預設的編碼。

在此Xml.Document()函數解析了XML文件內容,並將其中的資料轉換為資料表(Table)形式。過程中它會嘗試將XML文件中的節點結構映射到 Power Query資料表,通常會將每個子節點轉換為清單列表中的一個資料表格。由於此xml範例裡僅有一個資料表。例如:經由此函數執行後的結果如下:

這個結果是一個兩個欄位的資料表,資料行名稱分別為Name及Table,其中,Name資料行的資料型態是文字資料型態;Table資料行的資料型態則是資料表型態。而此資料表裡僅有1筆資料記錄,內容為"講師"及Table。"講師"是字串資料、Table是一張資料表。大家可以回顧筆者曾經撰寫的系列文章(Power Query三大容器實作系列 - (8/8) 細說探索容器裡指定內容的M語言)裡的介紹,擷取資料表裡的第一筆資料記錄可以撰寫成:

= 來源{0},

這是一個輸出為記錄容器的查詢結果:

但若要再擷取此記錄的指定欄位,譬如Table欄位(這是一張資料表容器的資料型態),則可以寫成:

= 來源{0}[Table],

便輕而易舉的擷取到此資料表的內容。

而在Power Query的記錄容器之表達方式是以一對中括號來呈現,因此,上述的這一筆資料記錄可以如下的M語言程式碼來呈現:

=[Name="講師",Table=Table]

 

以清單形式的呈現,將如下所示:

={[Name="講師",Table=Table]}

因此,所要擷取此清單裡的內容,則是:

{[Name="講師",Table=來源]},