2014-12-01 5 views
0

Я хочу, чтобы иметь возможность использовать следующий, чтобы найти компакт-диск с названием:Scala для понимания фильтрации XML?

val empire = 
    cdPrices find { case(cd, _, _) => 
     cd == "Empire Burlesque" 
    } 

println(empire) 

выше не работает, потому что я получаю «конструктор не может быть реализован к ожидаемому типу».

При попытке следующий альтернативный синтаксис, я получаю ошибки относительно типа:

val (empire, price, year) = cdPrices find (_._1 == "Empire Burlesque") 
      getOrElse("Empire Burlesque", "10","1985") 

Что такое правильный синтаксис для этого?

Мой XML выглядит следующим образом: http://www.xmlfiles.com/examples/cd_catalog.xml

+0

Что такое cdPrices и как вычисляется его значение. Какие «ошибки относятся к типу». Детали, детали! –

+0

Во-первых, компилируется первый код. Вторая дает ошибку «конструктор не может быть ...», но это проблема с приоритетом - добавьте такие парсы, как это »(cdPrices find (_._ 1 ==« Empire Burlesque »)), и он работает. Маркировка закрывается как типографская ошибка, поскольку, насколько я вижу, это не имеет ничего общего с XML или для понимания, просто отсутствует parens. –

+0

. Ваш параметр getOrElse должен быть в дополнительных паранах тоже, поскольку он должен быть кортежем (компилятор делает это для вас, с предупреждением) –

ответ

1

Я не уверен, я понимаю ваш вопрос, но, возможно, вы ищете что-то вроде этого?

Следующий код возвращает <CD><TITLE>Empire Burlesque</TITLE>....</CD>, если найден, и возвращает <CD><TITLE>Empire Burlesque Not Found</TITLE></CD>, если мы не можем найти узел.

val root = scala.xml.XML.loadFile("cd_catalog.xml") 
val cd = (root \ "CD").find{x => (x \ "TITLE").text == "Empire Burlesque"} 
        .getOrElse{<CD><TITLE>Empire Burlesque Not Found</TITLE></CD>} 
println(cd) 

Проверка на http://www.scala-lang.org/api/2.10.4/index.html#scala.xml.Elem для того, что означает \ оператора, а также \\ удобно, когда вы что искать рекурсивно.

+0

Разве вы не можете использовать параметр «случай»? – Setsuna

+0

Если вы используете '{case x => ..}', это будет 'PartialFunction', который является подклассом' scala.Function1'. В этом случае вы можете использовать '{case x =>}'. но это не обязательно. см. http://www.scala-lang.org/api/current/index.html#scala.PartialFunction для более подробной информации. – ymonad

Смежные вопросы