斯卡拉 - 获取错误scala.xml.NodeSeq

问题描述:

我想编写代码来导入XML文件。我错过了一些基本的东西 - 这里是代码。斯卡拉 - 获取错误scala.xml.NodeSeq

import xml._ 

case class Menu(name: List[String]) 
case class BreakFastMenu(food: List[Menu], price: List[Menu], des: List[Menu], cal: List[Menu]) 

def toMenu(node : Node): Menu = { 
    val menuChart = (node \ "food") 
    Menu(menuChart) 
} 

def toBreakFastMenu(node: Node): BreakFastMenu = { 
    val name = (node \ "name").map(toMenu).toList 
    val price = (node \ "price").map(toMenu).toList 
    val des = (node \ "description").map(toMenu).toList 
    val cal = (node \ "calories").map(toMenu).toList 
    BreakFastMenu(name, price, des, cal) 
} 

val menuXML = XML.loadFile("simple.xml") 
val food = (menuXML \ "food").map(toBreakFastMenu).toArray 
food.foreach(println) 

和XML文件是在这里 - simple.xml 获取误差

MenuXML.scala:9: error: type mismatch; 
found : scala.xml.NodeSeq 
required: List[String] 
     Menu(menuChart) 
      ^
one error found 

任何人都可以整理我出去,我错过了什么的基本知识。

你在混合类型。菜单需要List [String]而不是scala.xml.NodeSeq。

由于您传递的是整个节点(scala.xml.NodeSeq),而不仅仅是它的内容,所以会出现错误。

我可以推荐这个博客帖子,以作进一步的解释回顾:http://alvinalexander.com/scala/how-to-extract-data-from-xml-nodes-in-scala

我会建议让你的代表权第一次总是如此。组织您的案例类的最佳方法是匹配节点的结构。例如。如果是<food>节点,你可能想要引入一个Food类。

import xml._ 

    case class Food(food: String, price: String, des: String, cal: String) 
    case class BreakFastMenu(foodItems: List[Food]) 

    def toFood(node : Node): Food = {   
    val name = (node \ "name").text 
    val price = (node \ "price").text 
    val des = (node \ "description").text 
    val cal = (node \ "calories").text 
    Food(name, price, des, cal) 
    } 


    val menuXML = XML.load("http://www.w3schools.com/xml/simple.xml") 
    val breakFastMenu = BreakFastMenu((menuXML \ "food").map(toFood).toList) 
    breakFastMenu.foodItems.foreach(println) 
+0

好的。但**菜单(menuChart.text)**这也给出了相同的错误。 – royki 2014-11-23 17:12:12

+0

Ahhh,对不起,我冲了回答,menuchart.text是String,而不是List [String]。好吧,让我重写你的解决方案,我会在一分钟内编辑我的答案 – 2014-11-23 17:15:11

+0

对不起。这是工作。谢谢。 – royki 2014-11-23 17:24:03