Scala XML处理–文字,序列化,解析,保存和加载示例
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>