ゼロからScalaの(8)のアノテーション、XML処理を学ぶために

A:注釈(ノート関連が本当にそれを補足し、それを考えると振り返るしたくありません)

コメントとは何ですか

         //私たちは、このに精通している、私は別のScalaとJavaのバーについての公式な説明、書き込み書いた
         彼らはラベルに対処できるように、ツールを持っていることをコードに挿入されている//注釈を
         ではありません// Javaの注釈バイトコードにコンパイルエフェクト源、彼らは単にデータを追加することを忘れバイトコードは、
         //ので、外部ツールを使用することができます。しかし、Scalaのコメントは、コンパイルプロセスに影響を与える可能性があります

どのような注釈を付けることができ

          //クラス、メソッド、フィールド、ローカル変数とパラメータは、注釈を追加することができ
          ますが、複数のメモを追加することができます順序には影響しなかった//
          あなたは、コンストラクタの前に置かれたコメントに必要な、//メインのコンストラクタ追加注釈を、そしてプラス杭は括弧
          ジェクト(){}クラスを
          クラスの資格@Inject()(:文字列、VARユーザー名
          :VARパスワード文字列)
          //表現に注釈を追加
          ヴァルMYMAP =地図(1> 1,2- > 2 、3-> 3)
          :{myMap.get(1)。@未確認{}一致}

          //追加注釈型パラメータ
          クラスMyContainer [@specialized T]が
          //実際のパラメータ注釈を追加
          文字列@cps [単位] // @ typeパラメータでCPS

ノートパラメータ

          

実現注意事項

          

Javaの修飾子

          

マーカーインタフェース

          

未確認の例外

          

VARARG

          

JavaBeansの

          

末尾再帰

          

ジャンプテーブルをインラインで生成

          

この方法は省略してもよいです

          

専門の基本的なタイプ

          

エラーと警告の注意事項について

          

2: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>

おすすめ

転載: www.cnblogs.com/wuxiaolong4/p/11879254.html