/ 城寒 / Scala - XML & JSON & JavaProp

Scala - XML & JSON & JavaProp

2018-01-27 posted in [Scala]

参考

XML

import scala.xml._
import scala.collection.mutable.Map
 
val confXML = XML.loadFile(path)
// 『\』获取下一级中的指定标签,『\\』获取全部的指定标签,『@』获取指定的属性
// 获取出的结果需要用iterator进行遍历
val confXML = XML.loadFile(path)
val field = (confXML\"fields"\"field").iterator
while(field.hasNext){
    val fi = field.next()
    // 没有的属性为空,不会报错
    if((fi\"@base").toString == ""){
        fieldMap += ((fi\"@name").toString -> (fi\"@values").toString.split(","))
    } else {
        fieldMap += ((fi\"@name").toString -> concat(
                         Array((fi\"@base").toString),
                         (fi\"@values").toString.split(",")))
    }
}
 
import java.io._
val OUTPUT_XML = "threshold.xml"
val INPUT_THRES = "threshold.csv"
// 从文件中获取,逐行插入到xml文件中
val files = Source.fromFile(INPUT_THRES).getLines
// 使用buffer,批量存储,最后一次性转为节点
// scala中当个的Node是不可以修改的,修改都是基于重新生成
// 修改: val node_new = node_old.copy(label = "new")
// 	     val node_chi = node_old.copy(child = node_old.child ++ <li>new child</li>)
val rules_buf = new NodeBuffer
while(files.hasNext){
    val line = files.next();
    val kv = line.split(',');
	// 可以直接使用 xml 的语法,注意表示式需要用大括号
    rules_buf += <rule id={kv(0)} type="ratio" way="bigger" threshold={kv(1)}/>
}
val rules_seq: NodeSeq = rules_buf
val rules = <rules>{rules_seq}</rules>
// 如果直接保存使用 XML.save("path", node) 即可,但是整个文件只有一行,不具有可读性
// 可以使用 PrintWriter 将输出进行格式化,比较美观,
val writer = new PrintWriter(new File(OUTPUT_XML))
val printer = new PrettyPrinter(width = 100, step = 4)
writer.write(printer.formatNodes(rules))
writer.close()
 

JAVA Properties

import java.util.Properties
import scala.collection.mutable.Map
import java.io.FileInputStream
import java.io.FileNotFoundException
import java.util.NoSuchElementException
 
val prop = new Properties()
prop.load(new FileInputStream(path))
val value = prop.getProperty(key, "notfound")
if(value == "notfound"){
   println("NOT FOUND KEY:" + key); default;
} else { value }
 

JSON

import com.alibaba.fastjson.JSON
import com.alibaba.fastjson.JSONException
import java.io.FileInputStream
import java.io.FileNotFoundException
import java.util.NoSuchElementException
 
val jsonObj = JSON.parseObject(str)
val percentage = jsonObj.get(fields(index)).toString
 
jsonObj.put("key", "value") // update or add
 
val jsonArray = JSON.parseArray
val json_itr = jsonArray.iterator
if(message_itr.hasNext){
    val message = JSON.parseObject(message_itr.next().toString)