《快学Scala》16章习题参考解答(XML)

前三题略

工具类

	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))
		}
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值