xmlstuff.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 214 行
SCALA
214 行
import java.io.StringReaderimport org.xml.sax.InputSourceimport scala.testing.SUnit.Assertimport scala.xml.{Node, NodeSeq, Elem, Text, XML}object Test extends AnyRef with Assert { /** returns true if exception was thrown */ def catcher(att: Function1[Unit, scala.xml.MetaData]): Boolean = { var ex = false try { att.apply({}) } catch { case scala.xml.MalformedAttributeException(msg) => println(msg) ex = true } ex } def main(args: Array[String]) { //val e: scala.xml.MetaData = null; //Node.NoAttributes; //val sc: scala.xml.NamespaceBinding = null; // ------------------------------------------ tests for class NodeSeq /** println("checking wellformed attributes"); { import scala.xml.{ UnprefixedAttribute, Null } assertTrue(catcher {x:Unit => new UnprefixedAttribute("key", "<", Null)}); // < illegal assertTrue(catcher(x:Unit => new UnprefixedAttribute("key", "&", Null))); // & illegal assertTrue(catcher(x:Unit => new UnprefixedAttribute("key", "a&a", Null))); // & illegal assertTrue(catcher(x:Unit => new UnprefixedAttribute("key", "a&a;&", Null))); // 2nd & assertFalse(catcher(x:Unit => new UnprefixedAttribute("key", "a&a; <<", Null))); }*//*checking wellformed attributes< not allowed in attribute valuepassed okmalformed entity reference in attribute value [&]passed okmalformed entity reference in attribute value [a&a]passed okmalformed entity reference in attribute value [a&a;&]passed okpassed ok*/ println("NodeSeq") val p = <foo> <bar gt='ga' value="3"/> <baz bazValue="8"/> <bar value="5" gi='go'/> </foo>; val pelems_1 = for( val x <- p \ "bar"; val y <- p \ "baz" ) yield { Text(x.attributes("value").toString + y.attributes("bazValue").toString+ "!") }; val pelems_2 = new NodeSeq { val theSeq = List(Text("38!"),Text("58!")) }; assertSameElements(pelems_1, pelems_2) assertEquals(p \\ "@bazValue", Text("8")) val books = <bks> <book><title>Blabla</title></book> <book><title>Blubabla</title></book> <book><title>Baaaaaaalabla</title></book> </bks>; val reviews = <reviews> <entry><title>Blabla</title> <remarks> Hallo Welt. </remarks> </entry> <entry><title>Blubabla</title> <remarks> Hello Blu </remarks> </entry> <entry><title>Blubabla</title> <remarks> rem 2 </remarks> </entry> </reviews>; println( new scala.xml.PrettyPrinter(80, 5).formatNodes ( for (t <- books \\ "title"; r <- reviews \\ "entry" if r \ "title" == t) yield <result> { t } { r \ "remarks" } </result> )); // example println( for (t @ <book><title>Blabla</title></book> <- new NodeSeq { val theSeq = books.child }.toList) yield t );val phoneBook = <phonebook> <descr> This is the <b>phonebook</b> of the <a href="http://acme.org">ACME</a> corporation. </descr> <entry> <name>John</name> <phone where="work"> +41 21 693 68 67</phone> <phone where="mobile">+41 79 602 23 23</phone> </entry> </phonebook>;val addrBook = <addrbook> <descr> This is the <b>addressbook</b> of the <a href="http://acme.org">ACME</a> corporation. </descr> <entry> <name>John</name> <street> Elm Street</street> <city>Dolphin City</city> </entry> </addrbook>; println( new scala.xml.PrettyPrinter(80, 5).formatNodes ( for (t <- addrBook \\ "entry"; r <- phoneBook \\ "entry" if t \ "name" == r \ "name") yield <result> { t.child } { r \ "phone" } </result> )); /* namespaces */ // begin tmp println("namespaces") val cuckoo = <cuckoo xmlns="http://cuckoo.com"> <foo/> <bar/> </cuckoo>; assertEquals(cuckoo.namespace, "http://cuckoo.com") for (n <- cuckoo \ "_" ) { //println("n = "+n); //println("n.prefix = "+n.prefix); //.println("n.scope = "+n.scope); assertEquals( n.namespace, "http://cuckoo.com") } println("validation - elements") val vtor = new scala.xml.dtd.ElementValidator(); { import scala.xml.dtd.ELEMENTS import scala.xml.dtd.ContentModel._ vtor.setContentModel( ELEMENTS( Sequ( Letter(ElemName("bar")), Star(Letter(ElemName("baz"))) ))); } assertEquals(vtor( <foo><bar/><baz/><baz/></foo> ), true); { import scala.xml.dtd.MIXED import scala.xml.dtd.ContentModel._ vtor.setContentModel( MIXED( Alt(Letter(ElemName("bar")), Letter(ElemName("baz")), Letter(ElemName("bal"))))); } assertEquals(vtor(<foo><bar/><baz/><baz/></foo> ), true) assertEquals(vtor(<foo>ab<bar/>cd<baz/>ed<baz/>gh</foo> ), true) assertEquals(vtor(<foo> <ugha/> <bugha/> </foo> ), false) println("validation - attributes") vtor.setContentModel(null) vtor.setMetaData(List()) assertEquals(vtor( <foo bar="hello"/> ), false) { import scala.xml.dtd._ vtor setMetaData List(AttrDecl("bar", "CDATA", IMPLIED)) } assertEquals(vtor(<foo href="http://foo.com" bar="hello"/>), false) assertEquals(vtor(<foo bar="hello"/>), true) { import scala.xml.dtd._ vtor.setMetaData(List(AttrDecl("bar","CDATA",REQUIRED))) } assertEquals( vtor( <foo href="http://foo.com" /> ), false ) assertEquals( vtor( <foo bar="http://foo.com" /> ), true ) }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?