zoukankan      html  css  js  c++  java
  • 从零学scala(八)注解、XML处理

    一:注解(注解相关的实在是不想看,后面想起来了再补上吧)

    什么是注解

             //这个大家都比较熟悉,我就写一个官方的解释,写一下scala和java的不同吧
             //注解是那些你插入到代码中以便有工具可以对他们进行处理的标签
             //java注解并不影响源码编译成字节码,他们仅仅是忘字节码中添加数据,
             //以便外部工具可以利用他们。但是scala的注解可以影响编译过程

    什么可以被注解

              //类、方法、字段、局部变量和参数都可以添加注解
              //你可以添加多个注解,先后次序没有影响
              //主构造器添加注解的时候,你需要将注解放置在构造器之前,并加上一堆圆括号
              class Inject(){}
              class Credentials @Inject()(var username:String,
              var password:String)
              //为表达式添加注解
              val myMap = Map(1->1,2->2,3->3)
              {myMap.get(1):@unchecked} match{}

              //为类型参数添加注解
              class MyContainer[@specialized T]
              //为实际参数添加注解
              String @cps[Unit] //@cps带一个类型参数

    注解参数

              

    注解实现

              

    Java修饰符

              

    标记接口

              

    受检异常

              

    变长参数

              

    JavaBeans

              

    尾递归

              

    跳转表生成与内联

              

    可省略方法

              

    基本类型的特殊化

              

    用于错误和警告的注解

              

    二:XML处理

    XML字面量

              //就是可以直接写XML的代码进scala代码,直接生成XML元素。即Elem类
              val doc = <html><head><title>title</title></head></html>
              //部分的XML代码也是可以的。即NodeSeq类
              val item = <li>Fred</li><li>Wilma</li>

    XML字节

              val elem = <a href="http://scala-lang.org">
              The <em>Scala</em> language</a>
              println(elem.label)//a标签
              println(elem.child)//a之间的东西

              

              import scala.xml.NodeBuffer
              import scala.xml.NodeSeq

              val nodebuffer = new NodeBuffer
              nodebuffer += <li>Fred</li>
              nodebuffer += <li>Wilma</li>
              val nodes :NodeSeq = nodebuffer//成不可变的变量

    Seq[Node]
    NodeSeq
    Iterable[Metadata] Document node
    Metadata Elem SpcialNode
          Atom EntityRef ProInstr Comment
        Text PCData Unparsed    
     

    元素属性

              val href = <a href="http://www.baidu.com"></a>
              println(href.attributes("href"))
              
              val image = <img src="src" alt="alt"></img>
              val alt = image.attributes("alt")
              println(alt) //alt的值没有需要转移的字符
              println(alt.text) //alt中有需要转移的字符
              
              val data = href.attributes.get("hrefa").getOrElse("")
              println(data)//获取到或者获取不到

              for(attr<- href.attributes) //遍历所有属性
                        println(attr.key + "|" + attr.value)

    内嵌表达式

              //如果代码产生的是一个节点序列,序列中的节点会被直接添加到XML。
              //所有其他值会被放进Aton[T]中,这是一个针对类型T的容器(集合)
              //通过这种方法你可以在XML树种放任何值
              val change = "15"
              val href = <a href="http://www.baidu.com">change</a>
              
              //不光能放变量还能放代码,用{}进行了转义。你如果需要{}字符串可以写{{
              val data = <ul>{for(i <- 1 to 10) yield i}</ul>
              println(data)

    在属性中使用表达式

              val change = Seq("http://www.baidu.com")
              val href = <a href={change.apply(0)}></a>
              //<a href="{change.apply(0)}"></a>
              //表达式用""起来这样不是代码块
              <img alt={
                        if("TODO" == "TODO") null else "aa" }></img>
              //上面的表达式中如果为null,钙元素就不会有alt属性

    特殊字节类型

              //有时候你需要将非XML文本包含到XML中比如:[CDATA]
              val js = <script><![CDATA[if(1 > 0) alter(cold)]]></script>
              //上面的例子中,CDATA并不会转换成JS代码,你需要引入一个新的类
              val code ="if(1 > 0) alter(cold)"
              val js1 = <script>{PCData(code)}</script>

              //你可以在Unparsed节点中包含任意文本。他们会被原样保留大师不推荐使用,容易出错
              val n1 = <xml:unparsed><&></xml:unparsed>

    类XPath表达式

              //NodeSeq类提供了类似XPath中 / 和 //操作符的方法。
              //由于//表示注释 scala使用 和 \来代替
              val list = <d1 a="a"><dt>A</dt><dt>B</dt></d1>
              val iter = list "dt"
              //上例子显示的是所有dt的内容,但是只能过滤单层的元素,\能过滤多层
              //@开头可以定位属性
              println(list \ "d1" "@a")
              for(n <- list \ "dt")
                        println(n)

    模式匹配

              val list = <d1 a="a">ss</d1>
              list match {
              // case <d1/> => println("dt")
              // case <d1>{_*}</d1> => println() //直接过滤出来所有的子节点
              // case <d1>{child}</d1> => println(child)//子元素
              case <d1>{child @a}</d1> => println(child+"a")//过滤出来属性
              case _ => println("else")

    修改元素和属性

              import scala.xml.Attribute
              import scala.xml.Null

              val list = <ul><li>AA</li><li>BB</li></ul>
              val list2 = list.child.++:(<li>CC</li>)//添加子元素
              println(list2.toString())

              val img = <img src= "1.jpg"></img>
              val img2 = img % Attribute(null,"alt","An image",Null)
              //第一个参数是命名空间,最后一个是元数据列表
              println(img2)

    XML变换

              //如果你需要将ul节点修改成ol,你要做的就是定义一个RewriteRule
              val rule = new RewriteRule{
                        override def transform(n:Node) =
                        n match {
                                  case <ul>{child}</ul> => <ol>child</ol>
                                  case _ => n
                        }
              }
              val data = <data><ul><aa>aa</aa></ul></data>.child.toList.apply(0)
              val result = new RuleTransformer(rule).transform(data)
              println(result)

    加载和保存

              //加载XML文件
              val root = XML.load("D://JAVA//sparkCode//Spark//bin//aa//NewFile.xml")
              val root = XML.load(new FileInputStream("D://JAVA//sparkCode//Spark//bin//aa//NewFile.xml"))
              val root = XML.load(new InputStreamReader(
              new FileInputStream("D://JAVA//sparkCode//Spark//bin//aa//NewFile.xml")))
              val root = XML.load(new URL("https://www.baidu.com/index.php"))
              println(root.toString())

              import scala.xml.parsing.ConstructingParser
              import java.io.File
              //可以保留注释的类
              val parse = ConstructingParser.fromFile(new File("D://JAVA//sparkCode//Spark//bin//aa//NewFile.xml"), preserveWS=true)
              val rootElec = parse.document().docElem

    命名空间

              //XML的命名空间类似于包的概念,XML的命名空间是一个URL或者URI
              //xmlns属性也可以声明一个命名空间
              <html xmlns="http://www.baidu.com">
              </html>
              //html元素及后代都被放置在这个命名空间中,后台也可以引入自己的空间
              <avg xmlns="http://www.baidu.com">
              </avg>

  • 相关阅读:
    IIS7 503错误 Service Unavailable
    android错误系列之导出数据库出错Failed to pull selection
    android学习笔记(入门篇)
    使用cmd命令删除文件夹下所有文件
    vue 动态插入组件
    js获取当前时间
    获取带参值
    以毫秒为单位的时间长度转化为时分秒时间格式的时间长度
    js如何复制一个对象?
    想在已创建的Vue工程里引入vux组件
  • 原文地址:https://www.cnblogs.com/wuxiaolong4/p/11879254.html
Copyright © 2011-2022 走看看