前三题略
工具类
object Util {
// 解析xhtml文件,使用Scala自带的parser
def parseXhtml(file: String) = {
var parser = ConstructingParser.fromFile(new File(file), preserveWS = true)
val doc = parser.document
println(doc.dtd)
doc.docElem
}
}
实验用网站http://horstmann.com/index.html
建议不要用百度,Scala的parser非常脆弱,<img>不加/,就会崩溃。将两选择简答的,有图片的网站。所以xhtml的格式一定要严格。
第四题
package p4{
object Main extends App{
val root = Util.parseXhtml("test.htm")
for(img <- (root \\ "img") if !(img.attributes.get("alt").nonEmpty)) println(img)
}
}
package p5{
object Main extends App{
val root = Util.parseXhtml("test.htm")
for(n <- (root \\ "img")) println(n.attributes.get("src").getOrElse("No src"))
}
}
package p6{
object Main extends App{
val root = Util.parseXhtml("test.htm")
for(n <- (root \\ "a")) println("text: " + n.child + " herf: " + n.attributes("href"))
}
}
第七题
package p7{
object Main extends App{
def transfer(mp: Map[String, String]) = {
var root = <dl></dl>
for((k, v) <- mp){
root = root.copy(child = root.child ++ (<dt>{Text(k)}</dt><dd>{Text(v)}</dd>))
}
root
}
val myMap = Map[String, String]("A" -> "1", "B" -> "2")
println(transfer(myMap))
}
}
第八题
package p8{
object Main extends App{
def transfer(root: Node) = {
var mp = Map[String, String]()
var key = ""
for(n <- root.child){
n match {
case <dt>{Text(k)}</dt> => key = k
case <dd>{Text(v)}</dd> => mp = mp + (key -> v)
}
}
mp
}
println(transfer(<dl><dt>A</dt><dd>1</dd><dt>B</dt><dd>2</dd></dl>).mkString(","))
}
}
第九题
package p9{
object Main extends App{
val root = Util.parseXhtml("test.htm")
val rule1 = new RewriteRule {
override def transform(n: Node) = n match {
case e @ <img/> if !(e.attributes.get("alt").nonEmpty) => e.asInstanceOf[Elem] % Attribute(null, "alt", "TODO", Null)
case other => other
}
}
val transformed = new RuleTransformer(rule1).transform(root)
val doctype = DocType("html",
PublicID("-//W3C//DTD XHTML 1.0 Strict//EN",
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"),
Nil)
// println(transformed)
XML.save("newTest.html", transformed.head, enc = "UTF-8", true, doctype)
}
}
第十题
package p10{
object Main extends App{
var parser = ConstructingParser.fromFile(new File("test.htm"), preserveWS = true)
val doc = parser.document
val dtd = doc.dtd
val root = doc.docElem
val rule1 = new RewriteRule {
override def transform(n: Node) = n match {
case e @ <img/> if !(e.attributes.get("alt").nonEmpty) => e.asInstanceOf[Elem] % Attribute(null, "alt", "TODO", Null)
case other => other
}
}
val transformed = new RuleTransformer(rule1).transform(root)
XML.save("newTest.html", transformed.head, enc = "UTF-8", true, new DocType("html", dtd.externalID, dtd.unparsedEntities))
}
}