草庐IT

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

coder 2024-06-28 原文

我有这段代码涉及 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/

有关xml - 无法选择正确的组合器进行解析并在 Scala 中处理它的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  6. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  7. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  8. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  9. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  10. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

随机推荐