2012-06-06 31 views
2

使用Scala的XML翻譯成系統屬性,什麼是轉換使用Scala的

<myapp> 
    <username>bill</username> 
    <password>secret123</password> 
    <background>#FFFFFF</background> 
</myapp> 

到以下系統性能的最佳方法:

myapp.username=bill 
myapp.password=secret123 
myapp.background=#FFFFFF 

假設轉換器追加到SYS.PROPS?

回答

1
scala> val s = "<myapp><username>bill</username><password>secret123</password><background>#FFFFFF</background></myapp>" 
s: java.lang.String = <myapp><username>bill</username><password>secret123</password><background>#FFFFFF</background></myapp> 

scala> val e = xml.XML.loadString(s) 
e: scala.xml.Elem = <myapp><username>bill</username><password>secret123</password><background>#FFFFFF</background></myapp> 

scala> val sp = new sys.SystemProperties 
sp: scala.sys.SystemProperties = 
Map(env.emacs -> "", java.runtime.name -> Java(TM) SE Runtime Environment, ....) 

scala> sp ++= e.child.map(n => (e.label + "." + n.label, n.text)) 
res11: sp.type = 
Map(env.emacs -> "", java.runtime.name -> Java(TM) SE Runtime Environment, ...) 

健全檢查:

scala> val p = java.lang.System.getProperties 
p: java.util.Properties = 
{env.emacs=, java.runtime.name=Java(TM) SE Runtime Environment,...} 

scala> import collection.JavaConversions._ 
import collection.JavaConversions._ 

scala> p filter { case (k, v) => k.startsWith("myapp") } \ 
      foreach { case (k,v) => println(k + "=" + v) } 
myapp.password=secret123 
myapp.background=#FFFFFF 
myapp.username=bill 
+0

謝謝,我怎麼可以處理更深入的條目,如威廉解析到myapp.username.secondary =威廉? – Reimeus

+0

您的XML是否會被修復(即,只有少量明確定義的標籤可能存在)?如果是這樣,那麼修改XPath表達式可能會更容易。例如val secondary = e \「secondary」; if(!secondary.isEmpty)sp + =(「myapp.username.secondary」,secondary.text) – sourcedelica

+0

理想情況下,希望它是一個開放的格式,但這也不錯:) – Reimeus