Scala XML处理–文字,序列化,解析,保存和加载示例

时间:2020-02-23 14:41:50  来源:igfitidea点击:

XML是一种以树的形式组织的半结构化数据。
当您序列化程序数据以保存在文件中或者通过网络传送时,半结构化数据将非常有用。
它定义了易于阅读解释的标准化文档。
XML代表可扩展标记语言。

XML由文本和标签这两个基本元素组成。
文本是一个字符序列。
标签由小于符号的字母数字字符和大于符号的字符组成。
结束标记与开始标记相同,不同之处在于它在结尾处包含一个斜杠。
起始标签和结束标签必须具有相同的标签。

例如;

<school>
<standard>4</standard>
</school>

上面是有效的XML,因为开始和结束标记相互匹配。

<school><standard>6</standard> 7

上面是无效的XML,因为未指定结束标记。

<school><standard>8 </school></standard>

上面的XML也是无效的,因为应该先关闭作为孩子的标准标签,然后再关闭父标签学校。

由于必须匹配标签,因此XML被构造为嵌套元素。
开始标签和结束标签形成一对匹配元素,并且元素可以彼此嵌套。
在上面的示例中,标准是嵌套元素。

缩写符号是开始标记,后跟斜杠,表示开始和结束标记。
一个带斜杠的标记表示一个空元素。

例如,下面的XML" standard"是一个空元素。

<school> <standard  </school>

开始标签可以具有属性。
属性是中间带有等号的名称/值对。
该属性用双引号或者单引号引起来。

例如

<standard section ="A" strings = "true"></standard>

现在,我们对XML有一个简短的了解,下面让我们看一下我们可以在Scala中进行XML处理的不同功能。

Scala XML文字

键入开始标记,然后继续编写XML内容。
读取XML内容,直到看到结束标记。

例如,打开Scala REPL shell并执行以下代码

<a>Scala is a functional Programming language</a>

可以使用花括号在标记值中评估Scala表达。
例如;

<a> {"hi"+",Reena"} </a>

输出:res1:scala.xml.Elem = <a>嗨,雷娜</a>

大括号转义可以包含任意scala内容,包括XML文字。
例如;

val marks = 78

<a> { if ( marks < 80) <marks> {marks} </marks> else xml.NodeSeq.Empty } </a>

输出:res3:scala.xml.Elem = <a> <marks> 78 </marks> </a>

花括号内的代码被评估为一个XML节点或者一系列XML节点。
在上面的示例中,如果标记小于80,则将其添加到<a>元素中,否则不添加任何内容。

大括号内的表达式将计算为标量值,然后转换为字符串并作为文本插入。

<a> {9+40} </a>

输出:res4:scala.xml.Elem = <a> 49 </a>

如果您打印节点,则文本中的<,>和&字符将被转义。

<a> {"</a>Hello Scala<a>"} </a>

输出:res5:scala.xml.Elem = <a> </a>你好Scala <a> </a>

下图显示了以上所有在Scala Shell中的Scala XML文字处理。

Scala中的序列化

序列化将内部数据结构转换为XML,以便可以存储,传输或者重用数据。
使用XML文字和大括号转义符转换为XML。
使用支持XML文字和大括号转义的toXML方法。

例如,首先,我们将定义Student类并创建一个实例。

scala> abstract class Student {
 	val name:String
 	val id:Int
 	val marks:Int
 	override def toString = name
 	 
 	def toXML =
 	<student>
 	<name>{name}</name>
 	<id>{id}</id>
 	<marks>{marks}</marks>
 	</student>
 	}

scala> val stud = new Student {
 	val name = "Rob"
 	val id = 12
 	val marks =90
 	}

scala> stud.toXML
res7: scala.xml.Elem =
<student>
   	<name>Rob</name>
 	<id>12</id>
 	<marks>90</marks>
	</student>

下图显示了Scala Shell中的Scala序列化过程。

Scala XML解析

XML类有很多可用的方法。
现在让我们看到一个非常有用的方法,即如何提取文本,子元素和属性。

提取文本XML节点上的text方法检索该节点内的文本。
例如;

scala> <a>Scala is a <p>programming</p> language </a>.text
Output: res8: String = "Scala is a programming language "

此处,标记从输出中排除。

提取子元素

通过调用\后跟标签名称来提取子元素。
例如;

scala> <school><standard><section>C</section></standard></school> \"section"
Output:res21: scala.xml.NodeSeq = NodeSeq(<section>C</section>)

scala> <school><standard><section>C</section></standard></school> \"school"
Output:res22:scala.xml.NodeSeq = NodeSeq(<school><standard><section>C</section></standard></school>)

下图显示了Scala Shell中的上述xml解析示例。

Scala提取XML属性

使用相同的\和\方法(在属性名称之前带有at符号(@))提取标记属性。
例如;

scala> val adam = <student
 	name = "Adam"
 	id ="12"
 	marks = "65" 
Output:adam: scala.xml.Elem = <student name="Adam" id="12" marks="65"

scala> adam \"@name"
Output:res3: scala.xml.NodeSeq = NodeSeq(Adam)

scala> adam \"@iduct"
Output:res5: scala.xml.NodeSeq = NodeSeq(12)

Scala反序列化示例

XML被转换回内部数据结构以供程序使用。
例如;

在序列化过程中创建的Student类将用作学生类,并使用toXML方法。

scala> def fromXML(node: scala.xml.Node): Student =
new Student {
  
    val name   = (node  \"name").text
     val id      = (node  \"id").text.toInt
     val marks  = (node  \"marks").text.toInt
   }

输出:fromXML:(节点:scala.xml.Node)

现在,调用在序列化中创建的双头 Bolt ,并按如下所示打印xml内容。

scala> val stud = new Student {
 	val name = "Rob"
 	val id = 12
 	val marks =90
 	}

现在调用toXML方法为:

scala> val st = stud.toXML
st: scala.xml.Elem =
<student>
 	<name>Rob</name>
 	<id>12</id>
 	<marks>90</marks> 
 	</student>

调用fromXML方法:

scala>fromXML(st)
Output:res17: Student = Rob

Scala XML保存到文件并从文件加载

XML.saveFull命令用于将数据转换为字节文件。
第一个参数是节点要保存到的文件名,第二个是节点,第三个是字符编码,第四个是是否在顶部写一个包含字符编码的XML声明,最后一个是文档类型。

例如;

scala> scala.xml.XML.save("stud.xml",st,"UTF-8",true,null)

我们在反序列化过程中使用上面创建的st节点。

现在打开" stud.xml"文件,其中存储了以下内容:

<?xml version='1.0' encoding='UTF-8'?>
<student>
 	<name>Rob</name>
 	<id>12</id>
 	<marks>90</marks>
 	</student>

现在要加载文件,我们可以使用load方法:

scala> val s1 = xml.XML.load("stud.xml")
s1: scala.xml.Elem =
<student>
 	<name>Rob</name>
 	<id>12</id>
 	<marks>90</marks>
 	</student>