将Scala Parser Combinator与JavaTokenParser

时间:2015-07-17 15:05:10

标签: xml scala parser-combinators

在我使用Scala Parser Combinator(JavaTokenParser)包含特征后,完美运行的Scala程序被破坏了

 trait QueryFragmentsParser  extends JavaTokenParsers  {
  .......
 }

 object QueryTranslator extends QueryFragmentsParser {
 .....
 .....
 val rootNodeID = (xml \ "@nodeid").toString()
 }

Eclipse中的错误消息:

  

value \不是QueryTranslator.Elem QueryTranslator.scala

的成员

有人可以帮我解决这个问题吗?

我使用了以下scala xml库。

import scala.xml.XML 
import scala.xml.Node 
import scala.xml.Text 
import scala.xml.Elem 
import scala.xml.Attribute 
import scala.xml.Null 
import scala.xml.transform._ 
import scala.xml.pull._ 
import scala.annotation.tailrec 
import scala.xml.UnprefixedAttribute.

1 个答案:

答案 0 :(得分:2)

Parsers特征定义了一个名为Elem的类型。您的object QueryTranslator继承自Parser,因此它也有QueryTranslator.Elem类型。由于您还继承了RegexParserJavaTokenParsers,因此QueryTranslator.ElemChar的别名,因为这些特征定义了该类型。显然xml的类型为QueryTranslator.Elem。因此,当xml \ ...出现错误时,xmlChar并且\没有Char运算符。

因此问题是xml类型为QueryTranslator.Elem时,您希望它属于scala.xml.Elem类型。大概就是这种情况,因为你在xml : Elem内的某处写了QueryTranslator。由于Elem始终会引用QueryTranslator.Elem内的QueryTranslator,因此您必须使用别名导入scala.xml.Elem或使用其(可能部分)合格来引用import scala.xml.{Elem => XElem} // ... def foo(xml: XElem) = ... 名称。因此,两个可行的解决方案是:

import scala.xml
// ...
def foo(doc: xml.Elem) = ...

operator*