本章主要讲解对XML的处理,要处理xml需要引入scala-xml-x.x.x.x.jar包,创建普通scala 类不会自动添加此jar包,需要手动引入之后就可以使用了
1.(0)得到什么,(0)(0)又得到什么,为什么?
仍然为<fred/>,<fred/>(0)代表节点本身,而且scala内部已实现了串接调用,所以<fred/>(0)(0)依然是节点本身
2.如下代码的值是什么?
你如何修复它?
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.比对
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”)
应产出
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;
}
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));
}