2013-06-28 1 views
1

Метод Elem (префикс, метка, атрибуты, область, дочерний) устарел в Scala 2.10, а Elem (префикс, метка, атрибуты, scope, minimEmpty, child) должен использоваться. Однако, по крайней мере, на пустых элементах новый метод apply имеет другое поведение. Устаревшие версии работает таким образом:XML в Scala - метод Elem с minimEmpty Boolean

val inputXML = <PC Price="100" CurrencyCode="USD"/> 
val rule1 = new RewriteRule { 
    override def transform(n: Node): Seq[Node] = n match { 
     case Elem(prefix, "PC", attribs, scope, content @ _*) => 
      Elem(prefix, "Mac", attribs, scope, content:_*) 
     case other => other 
    } 
} 

println(new RuleTransformer(rule1).transform(inputXML)) 

, который печатает:

List(<Mac Price="100" CurrencyCode="USD"/>) 

Но при использовании нового метода Элем, согласование не работает:

val inputXML = <PC Price="100" CurrencyCode="USD"/> 
val rule1 = new RewriteRule { 
    override def transform(n: Node): Seq[Node] = n match { 
     case Elem(prefix, "PC", attribs, scope, minimizeEmpty, content @ _*) => 
      Elem(prefix, "Mac", attribs, scope, true, content:_*) 
     case other => other 
    }  
} 

println(new RuleTransformer(rule1).transform(inputXML)) 

Приведенный выше код возвращает:

<PC Price="100" CurrencyCode="USD"/> 

Это ошибка или я делаю что-то неправильно? Я использую Scala 2.10.2.

Спасибо,

ответ

3

Там находится только один unapply метод в Elem:

def unapplySeq(n: Node): Option[(String, String, scala.xml.MetaData, scala.xml.NamespaceBinding, Seq[scala.xml.Node])] 

возвращает Tuple5, но вы пытаетесь использовать его, как он возвращает Tuple6. Вы не можете получить minimizeEmpty с помощью метода unapplySeq.

val inputXML = <PC Price="100" CurrencyCode="USD"/> 
val rule1 = new RewriteRule { 
    override def transform(n: Node): Seq[Node] = n match { 
     case Elem(prefix, "PC", attribs, scope, content @ _*) => 
      Elem(prefix, "Mac", attribs, scope, true, content:_*) 
     case other => other 
    }  
} 

println(new RuleTransformer(rule1).transform(inputXML)) 
// List(<Mac Price="100" CurrencyCode="USD"/>) 

Но я думаю, что здесь есть ошибка. Этот метод должен быть назван unapply, чтобы показать ошибку компиляции:

object ElemHelper { 
    def unapply(n: Node): Option[(String, String, scala.xml.MetaData, scala.xml.NamespaceBinding, Seq[scala.xml.Node])] = Elem.unapplySeq(n) 
} 

val rule1 = new RewriteRule { 
    override def transform(n: Node): Seq[Node] = n match { 
     case ElemHelper(prefix, "PC", attribs, scope, minimizeEmpty, content @ _*) => 
      Elem(prefix, "Mac", attribs, scope, true, content:_*) 
     case other => other 
    }  
} 

// <console>:16: error: wrong number of arguments for object ElemHelper 

Я создал bug report.

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

  • Нет связанных вопросов^_^