初心者也會用的 R 語言讀取 XML 資料分析實戰教學!(二)

在前一篇教學當中,我們已經看過 XML 的樹狀節點結構、 XML Schema 以及 R 語言 XML 套件的常用功能,在接下來的內容當中,我們將繼續研究 Xpath 語法,並介紹好用的視覺化工具 XML Viewer ,讀者可以搭配閱讀第一篇文章所列出 XML 包的功能作為補充。

剛試用 R XML 套件來讀取 XML 的時候應該不少人會有這樣的疑問:我要如何擷取一份 XML 中特定節點的屬性或者資料?

這樣的需求其實是很常見的,因為在許多 XML 當中重複的元素( element )名稱可能會經常出現在不同的路徑位置當中,而根據所處在的位置不同意義也會有很大的差別。

為了解決這個問題,我們需要了解另一個重要武器: Xpath 。

r-xml-tutorial-in-practice-2-1

善用 Xpath ,提升 XML 搜尋及讀取效率

Xpath 是一種簡單的路徑語言,表示法很像網站 url 或是資料夾路徑,它的主要作用就是運用語法邏輯表明資料在一份 XML 文件中的位置,透過正確指定 Xpath 我們可以輕易過濾出符合路徑搜尋語法的資料,並對這些資料執行各種動作,例如讀取節點( node )、讀取資料值、取得屬性( attribute )等等。

你可能還記得這個在前一篇教學中出現過的簡單示意圖:

r-xml-in-practice-example-5

假設現在我們想要對 Node C 採取行動,首先你可能想到要使用 xmlParse 功能讀取這份文件,接著再以 xmlApply 加上 xmlValue 的組合快速取得多個元素值,但直接運用 xmlValue 來取得元素值會有個問題,因為 xmlValue 將擷取所有分支的資料,因而會包含許多不需要的資訊反而造成識別困難。

我們稍作變化,運用超好用的函數 getNodeSet 並加入 Xpath 語法如下,就能在 xmlApply 當中指定要重複運算的 Node C ,取得想要的資料區塊:

範例變數<-xmlParse(file="XML檔案名稱")

xmlApply(getNodeSet(範例變數,"/NodeA/NodeC"), xmlValue)

R 語法我們稍後再研究,首先我們需要先了解 Xpath 的基本語法及其意義,才能充分掌握讀取資料的技巧:

Xpath 常用語法 1 : //

「//」後面加上節點,表示在整份 XML 當中搜尋符合該節點的資料,例如: //NodeA 。

Xpath 常用語法 2 : /

「/」符號使用的方式相當直覺,有如一般資料夾的樹狀關係,例如: /NodeB/NodeE 表示在尋找在 Node B 底下的 Node E 。

Xpath 常用語法 3 : @

「@」符號可以讓我們用指定屬性的方式鎖定資料集合,例如: //NodeA[@Name] 表示在 Node A 底下尋找具有屬性 Name 的元素;又例如 //NodeA[@Name="Tesla"] 則是更進一步鎖定名稱必須為 Tesla 的元素。

Xpath 常用語法 4 : []

熟悉 R 語法的人應該可以立刻聯想到括弧的作用,它是用來取特定順序資料的捷徑,例如 NodeA[1] 表示取 Node A 中第一個元素、 NodeA[2] 表示取 Node A 中第二個元素,以此類推。

更多的 Xpath 語法範例,可以參考 w3schools.com 的文件

另外其實 Xpath 也是支援邏輯運算的(例如大於小於、且、或),稱為 Xpath Operator ,可以參考這裡

工程師都愛用的 XML Viewer

有了 Xpath ,再加上第一篇文章介紹過的 XML Schema ,我們就可以正確地檢索出特定位置的資料進行後續整理分析,不過實務上,許多資料分析者由於要處理非常多的 XML ,不一定有心力仔細研究所有的 Schema ,因此就需要一個可以直覺、快速的工具來幫助我們了解一個 XML 大致上的樹狀圖長相,這裡就要介紹一個免費的好用工具:「 XML Viewer 」。

操作介面如下:

r-xml-tutorial-in-practice-2-2

使用方法很簡單,只要把 XML 的原始文字複製貼上在左邊的方塊當中,接著在中央部分選擇要轉換的格式,右邊的方塊就展示出對應的結果。

根據貼上的檔案大小,運算的速度會有很大差別,因此它的主要作用不是真的拿來解析 XML ,而是讓我們可以快速掌握重要的節點結構。

下圖是採用台鐵鐵路時刻表 XML 選擇 TreeView 轉換後的範例:

r-xml-tutorial-in-practice-2-3

從視覺化的樹狀圖當中,我們很快可以發現一些關於這份 XML 文件的重要結構資訊:最上層的節點為 taitrainlist ,底下由多個 traininfo 組成,而每一個 traininfo 當中又有許多個 timeinfo 元素,同時許多資料值是以屬性的方式存在而不是單純的元素值…。

下一集,我們將會運用截至目前為止的 XML 知識實際解析政府開放資料。

系列文章:

初心者也會用的 R 語言讀取 XML 資料分析實戰教學!(一)

初心者也會用的 R 語言讀取 XML 資料分析實戰教學!(三)

更多 R 資料科學實戰:

* 統計R語言實作筆記系列 – 2D視覺化進階 GGPLOT()的基本架構(一)

* 統計R語言實作筆記系列 – 用 SHINY 套件極速打造你的商業智慧分析網站!

* 統計R語言實作筆記系列- 直線ABLINE()、曲線CURVE()與多邊形POLYGON()

* 統計R語言實作筆記系列 – 2D視覺化入門

* 統計R語言實作筆記系列 – R的字串處理:GREP套件包(GREP、GREPL、REGEXPR、GREGEXPR、REGEXEC)

(Visited 1,689 times, 2 visits today)

Wendell.Huang

科技公司嫌棄太活潑,消費品牌挑剔太沉悶…, 經常必須解釋自己在學什麼, 不小心就摔破對方眼鏡的業餘書呆子。

One Comment

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *