作者:月光魔术师2702935955 | 来源:互联网 | 2023-09-08 20:25
我有一个Map[String,List[String]]
类型的数据,并想另存为Scala中的xml
文件。如果选择使用scala.xml.XML.save
方法,则需要将map转换为node。
但是我没有找到一种方法。似乎地图或节点库中没有方法可以做到这一点。
您必须手动创建转换器,因为xml可以完全不同,这是您可以使用的示例。
import scala.xml.{Node,NodeSeq}
val a:Map[String,List[String]] = Map("animal" -> List("cat","dog","bird"),"fruit" -> List("banana","apple"))
def convertToXML(parametersToCreateXML: Map[String,List[String]]): NodeSeq = {
def generateTitleToData(keyValue: (String,List[String])): Node = {
{keyValue._1}
{keyValue._2.map(x =>generateData(x))}
}
def generateData(value: String): Node = {
{value}
}
parametersToCreateXML.map(x => generateTitleToData(x)).toSeq
}
convertToXML(a)
res0: scala.xml.NodeSeq =
NodeSeq(
animal
cat
dog
bird
,
fruit
banana
apple
)
如您所见,从Seq[Node]
到NodeSeq
的转换是隐式完成的。
,
您还可以尝试下一个库:https://github.com/mthaler/xmlconfect-与其他编解码器库(例如,circe,Play Json等)类似的想法-它通过隐式类型基于类型构建编解码器。
您的情况如下所示:
import scala.xml.PrettyPrinter
import com.mthaler.xmlconfect._
import com.mthaler.xmlconfect.ProductFormatInstances._
import com.mthaler.xmlconfect.BasicTextFormats._
import com.mthaler.xmlconfect.CollectionFormats._
object XmlFormat {
type RawData = Map[String,List[String]]
case class TypedDataElement(item: String)
object TypedDataElement {
implicit val format: XmlElemFormat[TypedDataElement] = xmlFormat1(TypedDataElement.apply)
}
case class TypedDataNode(key: String,item: List[TypedDataElement])
object TypedDataNode {
implicit val format: XmlElemFormat[TypedDataNode] = xmlFormat2(TypedDataNode.apply)
}
case class AllTypedData(data: List[TypedDataNode]) {
def toRawData: RawData = {
data.map(item => item.key -> item.item.map(_.item)).toMap
}
}
object AllTypedData {
implicit val format: XmlElemFormat[AllTypedData] = xmlFormat1(AllTypedData.apply)
def fromRaw(raw: RawData): AllTypedData = {
val all = raw.toList.map {
case (key,values) => TypedDataNode(key,values.map(TypedDataElement.apply))
}
AllTypedData(all)
}
}
def main(args: Array[String]): Unit = {
val rawData: RawData = Map("node" -> List("value1","value2"))
val typedData = AllTypedData.fromRaw(rawData)
val printer = new PrettyPrinter(80,4)
println(printer.formatNodes(typedData.toNode))
}
}
引入了案例类以提供键名。
在这种情况下的结果输出为:
node
value1
value2