《Programming in Scala 3rd》阅读笔记

Chapter 28 《Working with XML》

2018-06-11  本文已影响1人  liqing151

XML简介

scala>  <a> {"</a>potential security hole<a>"} </a>
res5: scala.xml.Elem = <a> &lt;/a&gt;potential security hole&lt;a&gt; </a>
scala> "<a>" + "</a>potential security hole<a>" + "</a>"
res5: String = <a></a>potential security hole<a></a>

序列化

def toXML =
<cctherm>
<description>{description}</description>
<yearMade>{yearMade}</yearMade>
<dateObtained>{dateObtained}</dateObtained>
<bookPrice>{bookPrice}</bookPrice>
<purchasePrice>{purchasePrice}</purchasePrice>
<condition>{condition}</condition>
</cctherm>
scala> <a> {{{{brace yourself!}}}} </a>
res7: scala.xml.Elem = <a> {{brace yourself!}} </a>

反序列化

提取tag之间的文字

elem.text

scala> <a> input ---&gt; output </a>.text
res9: String = " input ---> output "
提取子元素

使用\方法,使用\\方法可以进行递归的子元素搜索。

scala> <a><b><c>hello</c></b></a> \"a"
res13: scala.xml.NodeSeq = NodeSeq()
scala> <a><b><c>hello</c></b></a> \\"a"
res14: scala.xml.NodeSeq =
NodeSeq(<a><b><c>hello</c></b></a>)  //是可以包含自身
提取属性

使用\方法和\\方法,加入@符号

scala> val joe = <employee name="Joe" rank="code monkey" serial="123"/>
scala> joe \"@name"
res17:  scala.xml.NodeSeq = Joe
反序列化

从上面的提取每个部分元素的方法对XML进行反序列化生成结构化的数据。


XML和字节流之间的转换

将XML转换为字节数据:
scala.xml.XML.save("therm1.xml", node)
从字节数据中获取数据生成XML
val loadnode = xml.XML.loadFile("therm1.xml") loadnode: scala.xml.Elem = ……

模式匹配

匹配单个节点
def proc(node: scala.xml.Node): String = node match {
case <a>{contents}</a> => "It's an a: " + contents //这里的<a>与content之间的空格或者换行在node中有需要有强制性的匹配
case <b>{contents}</b> => "It's a b: " + contents
case _ => "It's something else."
}
可以匹配的XML为<a>It's a comment</a>,不能匹配的为<a><em>It's a comment</em></a>
匹配一个节点序列,而不是单个节点
def proc(node: scala.xml.Node): String = node match {
case <a>{contents @ _*}</a> => "It's an a: " + contents
case <b>{contents @ _*}</b> => "It's a b: " + contents
case _ => "It's something else."
}
多次使用模式匹配,跳过空白字符
val catalog =
  <catalog> //空白字符
    </cctherm>
       ……
    </cctherm>
    <cctherm>
        ……
   </cctherm>
 </catalog> // catalog中共有5个子节点,有3个空白字符节点,两个cctherm节点
// 没有处理<catalog></catalog>前后的空白字符
catalog match {
    case <catalog>{therms @ _*}</catalog> =>
        for (therm <- therms)
            println("processing: " +
                    (therm \"description").text)
}
//进一步使用模式匹配<cctherm>{_*}</cctherm生成for循环的迭代器。处理了空白字符
catalog match {
    case <catalog>{therms @ _*}</catalog> =>
        for (therm @ <cctherm>{_*}</cctherm> <-
                     therms)
            println("processing: " +
                    (therm \"description").text)
}
上一篇下一篇

猜你喜欢

热点阅读