快学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.比对
为什么它们的行为不同?
第二种无法进行匹配,因为内嵌表达式中的字符串并不会被转成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; }
- 对一个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
- 快学scala第十六章习题——XML处理
- 快学Scala习题解答—第十六章 XML处理
- 《快学Scala》第十六章习题解答
- 快学Scala习题解答—第五章 类
- 快学Scala习题解答—第六章 对象
- 快学Scala习题解答—第八章 继承
- 快学Scala习题解答—第十章 特质
- 快学Scala习题解答—第十一章 操作符
- 快学Scala习题解答—第十三章 集合
- 快学Scala习题解答—第十一章 操作符
- 快学Scala习题解答—第六章 对象
- 快学Scala习题解答—第八章 继承
- 快学Scala习题解答—第十章 特质
- 快学Scala习题解答—第十一章 操作符
- 快学Scala习题解答—第十三章 集合
- 快学Scala习题解答—第十五章 注解
- 《快学Scala》16章习题参考解答(XML)
- 快学Scala学习笔记及习题解答(15-16注解与XML处理)
- Algorithm.Induction(归纳法)
- 英语总结2016年4月
- WebService学习总结(二)——WebService相关概念介绍
- 硬件描述语言相关
- MyISAM与InnoDB区别
- 快学scala第十六章习题——XML处理
- shared_ptr
- WebService学习总结(三)——使用JDK开发WebService
- 双栈排序
- JAVA线程学习笔记
- HBbase的部署与实施
- 棋盘覆盖问题
- win7上Mysql导出(多张表)表结构及表数据 mysqldump用法
- Swift 数组中 Map,FlatMap,Filter,Reduce的使用