标签:blog io os ar for sp div on cti
import scala.collection.mutable.ListBuffer import scala.collection.immutable.{Map =>sMap};//不可变 import scala.collection.mutable.{Map =>xMap};//可变 object Main { def main(args: Array[String]): Unit = { val s = """<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><conf><dbcps><test><MinIdle>1</MinIdle><MaxIdle>2</MaxIdle> |<MaxActive>2</MaxActive><Url>jdbc:mysql://localhost/test</Url><DriverClassName>com.mysql.jdbc.Driver</DriverClassName> |<InitialSize>2</InitialSize><Password></Password><Username>root</Username><MaxWait>500</MaxWait></test><class>org.apache.tomcat.dbcp.dbcp.BasicDataSource</class></dbcps> |<about><author>Fred</author><ver>1.0.0</ver></about><dbcs><test><Url>jdbc:mysql://localhost/test</Url><DriverClassName>com.mysql.jdbc.Driver</DriverClassName><Password> |</Password><Username>root</Username></test></dbcs><log><level>ALL</level><path>/home/wengmj/</path></log></conf>""".stripMargin; val m = XML.parse(s); println(m); } } object XML { def parse(s:String):sMap[String,Any]= { if (s == null || s.isEmpty) return null; val lex = new XML(s); val map = xMap[String,Any](); var n = lex.next; if(n==null) return null; n._1 match { case "0" => map(n._2) = parseValue(n._3); case "1" => map(n._2) = parseNode(lex) case "2" => map(n._2) = n._2; case _ => } return sMap.empty ++ map; } private def parseValue(v:String):Any = { v match { case "true" => true; case "false" => false; case "null" => null; case _ => numberType(v) match { case 1 => return v.toInt; case 2 => return v.toLong; case 3 => return v.toFloat; case _ => return v; } } } private def parseNode(lex:XML):Any = { var s = lex.next; if ("row" == s._2) { val list = ListBuffer[Any](); do { s._1 match { case "0" => list.append(parseValue(s._3)); case "1" => list.append(parseNode(lex)); case "2" => list.append(s._3); case "-1" => return list.toList; } s = lex.next; } while (s != null); return list.toList; } val map = xMap[String,Any](); do { s._1 match { case "0" => map(s._2) = parseValue(s._3); case "1" => map(s._2) = parseNode(lex); case "2" => map(s._2) = s._3; case "-1" => return sMap.empty ++ map; } s = lex.next; } while(s != null); return sMap.empty ++ map; } private def numberType(s:String):Int= { if (s == null) return -1; val n = s.length; if(n == 0) return -1; val k = Array(0, 0, 0, 0, 0); for(i <- s.getBytes) { i match { case 43|45 => k(0) = i; k(1) += 1; case 46 => k(2) = i; k(3) = k(3)+1; case 48|49|50|51|52|53|54|55|56|57 => k(4) = k(4)+1; case _ => return -1; } } if (k(1) > 0 && (k(1) > 1 || k(0) > 0 || n < 2)) return -1; if (k(3) > 0) return if(k(3) <= 1 && k(2) >= 1 && k(2) <= n - 2) 3 else -1; if (k(4) > 9) return 2; return 1; } } class XML(private val s:String) { private val a:Array[Int] = Array(0,0,0,0); private def subs(f:String,s:Int,e:Int) = f.substring(s, e); private def idx(f:String,e:Char,s:Int) = f.indexOf(e,s); private def next:Tuple3[String,String,String]= { a(0) = idx(s,‘<‘, a(1)); if (a(0) == -1) return null; s.charAt(a(0) + 1) match { case ‘?‘ => a(1) = idx(s,‘>‘, a(0)); return next; case ‘/‘ => a(1) = idx(s,‘>‘, a(0)); return ("-1", subs(s,a(0) + 2, a(1)), ""); case _ => } a(2) = idx(s,‘<‘, a(0) + 1); s.charAt(a(2) + 1) match { case ‘/‘ => a(1) = idx(s,‘>‘, a(2)); a(3) = idx(s,‘>‘, a(0)); return ("0", subs(s,a(0) + 1, a(3)), subs(s,a(3) + 1, idx(s,‘<‘, a(0) + 1))); case ‘!‘ => a(3) = s.indexOf("]]>", a(2) + 1); a(1) = idx(s,‘>‘, a(3) + 3); return ("2", subs(s,a(0) + 1, idx(s,‘>‘, a(0))), subs(s,a(2) + 9, a(3))); case _ => a(1) = idx(s,‘>‘, a(0)); return ("1", subs(s,a(0) + 1, a(1)), ""); } } }
标签:blog io os ar for sp div on cti
原文地址:http://www.cnblogs.com/scala/p/4029431.html