天天看點

Scala入門到精通——第二十七節 Scala操縱XML

xml 字面量

xml内容提取

xml對象序列化及反序列化

xml檔案讀取與儲存

xml模式比對

xml是一種非常重要的半結構化資料表示方式,目前大量的應用依賴于xml,這些應用或利用xml作為資料交換格式,或利用xml進行檔案配置等。像java、c++及其它流行的程式開發語言都是依賴于第三方庫來實作xml的操作,例如java經常通過jdom,dom4j等xml處理工具進行xml的操縱,但scala提供了對xml的原生支援,通過scala.xml._包下的類或對象可以進行任何的xml操作。下面的代碼示範了scala中如何定義xml字面量。

通過上面的代碼不能發現,scala會自動地對xml進行解析,并識别為scala.xml.elem類型。scala中與xml相關的包和類很多,具體如下圖所示:

Scala入門到精通——第二十七節 Scala操縱XML

在深入講解scala操縱xml之前,先對幾個主要的術語進行介紹:

Scala入門到精通——第二十七節 Scala操縱XML

圖中描述了屬性、根元素、子元素、元素及文本的概念及它們之間的關聯關系,是以的文本、元素被統稱為節點(node)。下面給出的scala xml中的幾個重要的類:

node類。它的一個抽象類,用于對象xml中的所有節點進行抽象:

Scala入門到精通——第二十七節 Scala操縱XML

nodeseq類,它同樣是一個抽象類,指的是節點的序列,node繼承自nodeseq,可以看node可作是nodeseq隻有一個元素的情況。

scala中的xml中可以執行scala表達式,例如

提取xml中的文本:

這種提取方式将xml中所有的文本内容提取出來并拼接在一起,在實際中我們可能需要精确提取,比如我隻想提取name元素中的内容,此時可以采用下列方式:

x \ “age” 這種子元素的提取方式,傳回的類型是scala.xml.nodeseq

\的方式隻能提取子元素,不能提取子元素的子元素,例如:

通過\和\可以提取任何xml的子元素及其文本内容,但如果xml元素帶有屬性,那又如何提取呢?

下面給出的是對象的xml序列化操作:

反序列化操作:

前一小節,我們的序列化與反序列化操作都在記憶體中進行的,在通常的情況下都是将序列化後的xml儲存在檔案當中,在反序列化時再從檔案中讀取,實作方式如下:

下面給出的是save方法的标簽

scala操縱xml另外一個非常強大的地方在于,它能夠用于模式比對,進而非常靈活、友善地對xml進行處理:

從上述代碼可以看到,<code>&lt;persons&gt;{sub_element}&lt;/persons&gt;</code> 隻能比對标簽<code>&lt;persons&gt;&lt;/persons&gt;</code> 中隻存在單個子元素的情況,如果具有多個子元素,即子元素構成nodeseq,則不能比對,需要進行進一步處理,代碼如下:

因為傳回的是arraybuffer,可以通過for循環周遊對xml子元素中的内容進行提取,如:

添加公衆微信号,可以了解更多最新spark、scala相關技術資訊

Scala入門到精通——第二十七節 Scala操縱XML