xml - 无法选择正确的组合器进行解析并在 Scala 中处理它

标签 xml parsing scala parser-combinators

我有这段代码涉及 scala 的 Parsers 类:

trait SomeTrait extends SomeTrait2 {
  def myParse = {
    phrase(rep(
            ElemName(Some("http://someUri/"), "someNode1") ~       //compiles well, but fails sometimes at runtime
            ElemName(Some("http://someUri/"), "someNode2") ^^
            {
              case p1 ~ p2 ⇒  //......
            }) ^^
            {
              case p1 ⇒  // ....
            })
  }
}

在哪里

case class ElemName(namespace: Option[String], name: String) {
   // .....
}

通常情况下,“someNode1”和“someNode2”都存在于输入的soap字符串中(此处未指定,但无所谓)。然而,有时它们中的任何一个都可能存在或者甚至都不存在,在这种情况下它会在运行时崩溃。

<items>
  <subItems>
    <someNode1 val1="123" val2="456" />
    <someNode1 val1="123a" val2="456c" />
    <someNode1 val1="123b" val2="456d" />
    <someNode2 val1="123" val2="456" />
  </subItems>
  <subItems>
    <someNode2 val1="123cd" val2="456de" />
  </subItems>
  <subItems>
  </subItems>
  <subItems>
    <someNode1 val1="777" val2="888" />
  </subItems>
<items>

我必须处理这个问题。所以我做了:

trait SomeTrait extends SomeTrait2 {
  def myParse = {
    phrase(rep(
      ElemName(Some("http://someUri/"), "someNode1") |          // should work
      ElemName(Some("http://someUri/"), "someNode2") ^^ 
      {
        case p1 ~ p2 ⇒  //......
      }) ^^
      {
        case p1 ⇒  // ....
      })

      //or, I'm not sure which one to choose
      //ElemName(Some("http://someUri/"), "someNode1") |||      // should work also
      //ElemName(Some("http://someUri/"), "someNode2") ^^ 
  }
}

据我所知,这应该有效。但是,此时它不再编译,因为它说:

constructor cannot be instantiated to expected type;
[error]  found   : SomeTrait.this.~[a,b]
[error]  required: ElemName
[error]           case p1 ~ p2 ⇒ {
[error]                   ^
[error] one error found

我相信我必须用其他东西替换 case p1 ~ p2。

最佳答案

问题是|和|||两者都返回一个标记。具体来说:

一个 | b 尝试解析a,成功则返回,失败则尝试解析b 一个||| b 尝试解析 a 和 b 并使用解析最多字符的结果。我不认为他们中的任何一个是你想要的。如果是,您应该只使用 p1 而不是 p1 ~ p2。我认为您真正想要的是:

phrase(rep(
  ElemName(Some("http://someUri/"), "someNode1").? ~
  ElemName(Some("http://someUri/"), "someNode2").? ^^ 
  {
    case Some(p1) ~ Some(p2) ⇒  //......
    case Some(p1) ~ None => //.....
    case None ~ Some(p2) => //.....
  })

关于xml - 无法选择正确的组合器进行解析并在 Scala 中处理它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19379917/

相关文章:

python - Odoo one2many View

java - 使用 jsoup 解析 html 表

xcode - UIAlertController 无法显示 UIAlertView

安卓多语言支持 : string formatting issue due to different placeholder counts

html - XSLT 抽象

java - 无法实例化类-android编程

JAVA XML子解析

递归定义类型中的 Scala 和 == 方法

用于将字符串转换为元组的正则表达式

scala - 如何在 SBT 测试中自动启动 Amazon DynamoDB Local?