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

本章主要讲解对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 Scalatitle>
    head>
    <body>
    <p>Hello Scalap>
    <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 Scalatitle>
    head>
    <body>
    <p>Hello Scalap>
    <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客户端'>Androida>li>
    <li><a href="http://www.oschina.net/app" class='iphone' title='iPhone 客户端'>iPhonea>li>
    <li><a href="http://www.oschina.net/app" class='wp7' title='Windows Phone 客户端'>WP7a>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@ => 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 Scalatitle>
    <script>
    function matchwo(a,b)
    {
    if (a < b && a < 0) then
      {
      return 1;
      }
    else
      {
      return 0;
      }
    }
    ]]>
    script>
    head>
    <body>
    
    <p>Hello Scalap>
    <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));
    
    
      }

    你可能感兴趣的:(scala)