快学scala第十六章习题——XML处理

来源:互联网 发布:linux ftp put命令 编辑:程序博客网 时间:2024/06/07 18:50

本章主要讲解对XML的处理,要处理xml需要引入scala-xml-x.x.x.x.jar包,创建普通scala 类不会自动添加此jar包,需要手动引入之后就可以使用了

1.(0)得到什么,(0)(0)又得到什么,为什么?

仍然为<fred/>,<fred/>(0)代表节点本身,而且scala内部已实现了串接调用,所以<fred/>(0)(0)依然是节点本身

2.如下代码的值是什么?

  • Opening bracket: [
  • Closing bracket: ]
  • Opening brace: {
  • Closing brace: }

你如何修复它?

xml报错,将大括号改成两个即可  val a =      <ul>    <li>Opening bracket: [</li>    <li>Closing bracket: ]</li>       <li>Opening brace: {{</li>       <li>Closing brace: }}</li>      </ul>;    println(a(0));    输出    <ul>    <li>Opening bracket: [</li>    <li>Closing bracket: ]</li>       <li>Opening brace: {</li>       <li>Closing brace: }</li>      </ul>

3.比对

  • Fred
  • match { case
  • {Text(t)}
  • => t } 和
  • {“Fred”}
  • match { case
  • {Text(t)}
  • => t }
    为什么它们的行为不同?
    第二种无法进行匹配,因为内嵌表达式中的字符串并不会被转成Text节点而是Atom[String]节点。这和普通的Text节点还是有区别的——Text是Atom[String]的子类。

    4.读取一个XHTML文件并打印所有不带alt属性的img元素。

    test.xhtml<html><head><title>My Scala</title></head><body><p>Hello Scala</p><p><img src="hamster.jpg" alt="TODO"/></p><p><img src="frog.jpg" alt="TODO"/></p><p><img src="dog.jpg" alt="inu"/></p></body></html>scala 代码:/*****第四题*******/  def readfromXmL(path : String)={     val root=XML.loadFile(path);     val imgs=root \\ "img";获取root下所有img文件     for(img<- imgs){       if(img.attributes("alt")!=null){         println(img);       }     }  }

    5.打印XHTML文件中所有图像的名称。即,打印所有位于img元素内的src属性值。
    xhtml文件同上

      def PrintAllSrc(path : String)={     val root=XML.loadFile(path);     val imgs=root \\ "img";     for(img<- imgs){       if(img.attributes("src")!=null){         println(img.attributes("src").text);       }     }  }

    6.读取XHTML文件并打印一个包含了文件中给出的所有超链接及其URL的表格。
    即,打印所有a元素的child文本和href属性。

    xhtml文件<html><head><title>My Scala</title></head><body><p>Hello Scala</p><p><img src="hamster.jpg"/></p><p><img src="frog.jpg"/></p><p><img src="dog.jpg" alt="inu"/></p><ul><li><a href="http://www.oschina.net/app" class='android' title='Android客户端'>Android</a></li><li><a href="http://www.oschina.net/app" class='iphone' title='iPhone 客户端'>iPhone</a></li><li><a href="http://www.oschina.net/app" class='wp7' title='Windows Phone 客户端'>WP7</a></li></ul></body></html>scala代码:  def readfromA(path : String)={    import java.io.InputStreamReader;    import java.io.FileInputStream;     val root=XML.load(new InputStreamReader(new FileInputStream(path),"UTF-8"));     val as=root \\ "a";     for(a<- as){       if(a.attributes("href")!=null){         println(a.attributes("href")+":"+a.text);       }     }  }

    7.编写一个函数,带一个类型为Map[String, String]的参数,返回一个dl元素,其中针对映射中每个键对应有一个dt,每个值对应有一个dd。例如:
    Map(“A” -> “1”, “B” -> “2”)
    应产出

    A
    1
    B
    2

      def ChangeXml(ii:Map[String,String]):Elem={    var a:Elem = <dl></dl>;    <dl> {for ((k,v) <- ii) yield {     <dt> {k} </dt><dd> {v} </dd>  ;    } }</dl>  }

    8.写一个函数,接受dl元素,将它转成Map[String,String]。该函数应该是前一个练习中的反向处理,前提是所有dt后代都是唯一(各不相同)的。

    def XmlChangeMap(elem:Elem):scala.collection.mutable.Map[String,String]={    //var arr=new ArrayBuffer();    var map:scala.collection.mutable.Map[String,String] = scala.collection.mutable.Map[String,String]();    if(elem.label!="dl"){      null;    }else{      val dt=elem \\ "dt";      println(dt(1));      val dd=elem \\ "dd";      println(dd);      println(0 until dt.size);      for(i<- 0 until dt.size ){        println(dt(i));        if(!map.contains(dt(i).text)){          map += (dt(i).text -> dd(i).text);        }      }    }    map;  }
    1. 对一个XHTML文档进行变换,对所有不带alt属性的img元素添加一个alt=”TODO”属性,其余内容完全不变。
    def modifyxmlSaveDtD(path:String){    import scala.xml.parsing.ConstructingParser;    import java.io.File;    val parser=ConstructingParser.fromFile(new File(path), preserveWS=true);    val doc = parser.document();    val root = doc.docElem;    import scala.xml.transform._;     val rule=new RewriteRule{       override def transform(n:Node)= n match{         case  img@ <img/>=> if(img.attributes("alt")==null) img.asInstanceOf[Elem] % Attribute(null, "alt", "TODO", scala.xml.Null) else img         case _=>n;       }     }     val trans=new RuleTransformer(rule).transform(root);     XML.save(path,trans(0));  }

    10.编写一个函数,读取XHTML文档,执行前一个练习中的变换,并保存结果。确保保存了DTD及所有CDATA内容。

    xhtml文件<html><head><title>My Scala</title><script><![CDATA[function matchwo(a,b){if (a < b && a < 0) then  {  return 1;  }else  {  return 0;  }}]]></script></head><body><!-- This is a comment --><p>Hello Scala</p><p><img src="hamster.jpg" alt="TODO"/></p><p><img src="frog.jpg" alt="TODO"/></p><p><img src="dog.jpg" alt="inu"/></p></body></html>scala文件: def modifyXml(path:String){    import java.io.InputStreamReader;    import java.io.FileInputStream;     val root=XML.load(new InputStreamReader(new FileInputStream(path),"UTF-8"));     val imgs=root \\ "img";     import scala.xml.transform._;     val rule=new RewriteRule{       override def transform(n:Node)= n match{         case  img@ <img/>=> if(img.attributes("alt")==null) img.asInstanceOf[Elem] % Attribute(null, "alt", "TODO", scala.xml.Null) else img         case _=>n;       }     }     val trans=new RuleTransformer(rule).transform(root);     XML.save(path,trans(0));  }
    0 0