本章主要讲解对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; }
- 对一个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)); }