解析 xml 导致新行匹配错误
Parsing xml causing match error with new line
您好,正在尝试使用模式匹配解析 xml
到以下 类 :
sealed trait Predicate
case class Single(name:String) extends Predicate
case class Or(ps: Seq[Predicate]) extends Predicate
case class And(ps: Seq[Predicate]) extends Predicate
这是我的解析器
object RuleParser {
def parse(ns: NodeSeq):Predicate ={
println(ns.toString())
ns match {
case <AND>{ xs @ _* }</AND> => And(xs map parse)
case <OR>{ xs @ _* }</OR> => And(xs map parse)
case <name>{ s @ _* }</name> =>Single(s.text)
}
}
}
然而当我发送这个
val elm1 =
<AND>
<name> John </name>
</AND>
RuleParser.parse(elm1)
我收到模式匹配错误。
但是当尝试这样做时:
val elm2 = <AND><name> John </name></AND>
RuleParser.parse(elm2)
没关系。
这是为什么呢?
问题是我正在读取一个文件,它是由多行构成的(比如 elm1)
我也试过像这样加载文件
val src = scala.io.Source.fromFile("/home/buzz/foo.xml")
val fxml = ConstructingParser.fromSource(src, false).document.docElem
RuleParser.parse(fxml)
但遇到了同样的问题
有什么办法可以解决这个问题吗?
顺便说一句,我正在使用 2.11.4
在您的第一个示例中,您似乎没有处理在 name
元素之前和之后出现在 AND
元素内的文本节点。
圣经有 a section describing pattern matching 个字面意思,其中有白色 space 个文本节点。
插图:
scala> <X>
| <Y/>
| </X>
res0: scala.xml.Elem =
<X>
<Y/>
</X>
scala> .child
res1: Seq[scala.xml.Node] =
ArrayBuffer(
, <Y/>,
)
scala> val xml.Text(s) = res1(0)
s: String =
"
"
库的 MarkupParser 可以选择关闭您在示例中使用的 "preserve whitespace,"。那应该行得通。
例如:
import scala.xml._, parsing._
sealed trait Predicate
case class Single(f: String => Boolean) extends Predicate
case class Or(ps: Seq[Predicate]) extends Predicate
case class And(ps: Seq[Predicate]) extends Predicate
object RuleParser {
def parse(ns: NodeSeq):Predicate ={
println(s"Parse: ${ns.toString}")
ns match {
case <AND>{ xs @ _* }</AND> => And(xs map parse)
case <OR>{ xs @ _* }</OR> => And(xs map parse)
case <name>{ s @ _* }</name> =>Single(_ == s.text)
}
}
}
object Test extends App {
val src = scala.io.Source.fromFile("foo.xml")
val fxml = ConstructingParser.fromSource(src, preserveWS = false).document.docElem
//val fxml = ConstructingParser.fromFile(new java.io.File("foo.xml"), preserveWS = false).document.docElem
println(RuleParser.parse(fxml))
val e1 =
<AND>
<name> John </name>
</AND>
println(RuleParser.parse(e1))
}
与 foo.xml:
<AND>
<name> John </name>
</AND>
产生:
Parse: <AND><name>John</name></AND>
Parse: <name>John</name>
And(List(Single(<function1>)))
Parse: <AND>
<name> John </name>
</AND>
Parse:
scala.MatchError:
(of class scala.xml.Text)
at xmlp.RuleParser$.parse(xmlp.scala:14)
您好,正在尝试使用模式匹配解析 xml 到以下 类 :
sealed trait Predicate
case class Single(name:String) extends Predicate
case class Or(ps: Seq[Predicate]) extends Predicate
case class And(ps: Seq[Predicate]) extends Predicate
这是我的解析器
object RuleParser {
def parse(ns: NodeSeq):Predicate ={
println(ns.toString())
ns match {
case <AND>{ xs @ _* }</AND> => And(xs map parse)
case <OR>{ xs @ _* }</OR> => And(xs map parse)
case <name>{ s @ _* }</name> =>Single(s.text)
}
}
}
然而当我发送这个
val elm1 =
<AND>
<name> John </name>
</AND>
RuleParser.parse(elm1)
我收到模式匹配错误。 但是当尝试这样做时:
val elm2 = <AND><name> John </name></AND>
RuleParser.parse(elm2)
没关系。
这是为什么呢? 问题是我正在读取一个文件,它是由多行构成的(比如 elm1)
我也试过像这样加载文件
val src = scala.io.Source.fromFile("/home/buzz/foo.xml")
val fxml = ConstructingParser.fromSource(src, false).document.docElem
RuleParser.parse(fxml)
但遇到了同样的问题
有什么办法可以解决这个问题吗?
顺便说一句,我正在使用 2.11.4
在您的第一个示例中,您似乎没有处理在 name
元素之前和之后出现在 AND
元素内的文本节点。
圣经有 a section describing pattern matching 个字面意思,其中有白色 space 个文本节点。
插图:
scala> <X>
| <Y/>
| </X>
res0: scala.xml.Elem =
<X>
<Y/>
</X>
scala> .child
res1: Seq[scala.xml.Node] =
ArrayBuffer(
, <Y/>,
)
scala> val xml.Text(s) = res1(0)
s: String =
"
"
库的 MarkupParser 可以选择关闭您在示例中使用的 "preserve whitespace,"。那应该行得通。
例如:
import scala.xml._, parsing._
sealed trait Predicate
case class Single(f: String => Boolean) extends Predicate
case class Or(ps: Seq[Predicate]) extends Predicate
case class And(ps: Seq[Predicate]) extends Predicate
object RuleParser {
def parse(ns: NodeSeq):Predicate ={
println(s"Parse: ${ns.toString}")
ns match {
case <AND>{ xs @ _* }</AND> => And(xs map parse)
case <OR>{ xs @ _* }</OR> => And(xs map parse)
case <name>{ s @ _* }</name> =>Single(_ == s.text)
}
}
}
object Test extends App {
val src = scala.io.Source.fromFile("foo.xml")
val fxml = ConstructingParser.fromSource(src, preserveWS = false).document.docElem
//val fxml = ConstructingParser.fromFile(new java.io.File("foo.xml"), preserveWS = false).document.docElem
println(RuleParser.parse(fxml))
val e1 =
<AND>
<name> John </name>
</AND>
println(RuleParser.parse(e1))
}
与 foo.xml:
<AND>
<name> John </name>
</AND>
产生:
Parse: <AND><name>John</name></AND>
Parse: <name>John</name>
And(List(Single(<function1>)))
Parse: <AND>
<name> John </name>
</AND>
Parse:
scala.MatchError:
(of class scala.xml.Text)
at xmlp.RuleParser$.parse(xmlp.scala:14)