XML文件簡介
在計算機領域,XML(extensible markup language)指的是可擴展標記語言,類似於HTML,它設計的宗旨是傳輸數據,而不是顯示數據,所以這也是它和HTML的一個明顯的差別。另外一個差別是XML的標籤沒有被預定義,我們可以根據自己的需要自行設計標籤名字,所以具有自我描述性。
一個具體的例子
<?xml version="1.0" encoding="UTF-8"?>
以上就是一個XML的例子,它擁有發送者和接受者,標題,內容等信息,所以自我描述非常清晰。但是這個文檔實際上只是包裝了一些數據信息,而並沒有做任何傳輸、接收和顯示文檔的信息,也就說你可以把他當成一個純文本。純文本的特點會讓你在不同的操作系統進行數據共享的門檻大大降低。
XML結構
XML文檔是一種樹結構,從根部開始擴展到枝葉。第1行是XML聲明,它定義版本和編碼。第2行是根元素,和第7行相對應,<message>叫做起始標籤,</message>叫做結束標籤,結束標籤有一個"/"符號。
XML文檔必須包含根元素,所有元素都可以擁有子元素。
XML文檔均可擁有文本內容和屬性。例如content元素下,屬性time為noon,屬性值要加引號。
XML文檔元素必須要有結束標籤,標籤對大小寫敏感,而且必須正確嵌套,也就是說一個標籤必須完整地嵌套在另一個標籤裡。
開始讀取文件,首先加載XML和RCurl包。
library(XML)
## Loading required package: bitops
url <- "https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Frestaurants.xml" file_url <- getURL(url)doc <- xmlTreeParse(file_url,useInternal=TRUE) rootNode <- xmlRoot(doc)
注意:這裡,url是https傳輸的,xmlTreeParse不支持,會報出不是一個XMl文檔的錯誤,所以我們需要先用getURL處理一下,然後用xmlTreeParse函數讀取,如果是http的話,就可以直接把url傳入xmlTreeParse函數。現在你可以把doc想象成一棵大樹,也就是XML文檔的樹結構,xmlRoot就是獲取文檔節點的函數。
xmlName(rootNode)
## [1] "response"
names(rootNode)
## row
這裡,我們通過xmlName函數獲取根節點的名稱是response,根節點下面包括叫做row的子節點。下面,我們分析一下如下的操作:
rootNode[[1]][[1]][[1]]
## <name>410</name>
我們在選擇xml文檔的節點時可以採用如上的類似於R語言中列表元素的索引。其中rootNode[[1]]我們選擇的進入根節點response下面的第一個子節點,就是"row"節點,rootNode[[1]][[1]]進入的就是row節點下的第一個子節點,也叫做row,rootNode[[1]][[1]][[1]],進入的是這個row節點下的第一個子節點就是name節點。所以我們獲得瞭如上的name元素。