- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 XML 文档,我需要使用 Nokogiri 对其进行解析,但是我需要过滤掉所有名称与请求不匹配的“角色”节点。
本质上,我想返回一个仅包含名字和姓氏与所需角色匹配的角色的数组。
当前状态:
除了 Controller 中的过滤/搜索行外,我的所有代码都可以正常工作。我查看了 Nokogiri 的 filter 和 search 功能,但似乎无法达到预期的结果。
XML 输入
<xml>
<role xsi:type="director">
<firstName>Thomas</firstName>
<lastName>JONES</lastName>
<company>Jones Enterprises</company>
</role>
<role xsi:type="director">
<firstName>Thomas</firstName>
<lastName>TEST</lastName>
<company>Test Factory</company>
</role>
</xml>
Controller
firstname = 'Thomas'
lastname = 'JONES'
@results = doc.css('role').where((doc.css('firstName').text == @firstname) AND (doc.css('lastName').text == @lastname))
查看
<%= @results.each do |t| %>
<%= t.company %>
<% end %>
要求的输出
Jones Enterprises
最佳答案
您可以使用 XPath 让 libXML2 基础为您完成工作:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<xml>
<role xsi:type="director">
<firstName>Thomas</firstName>
<lastName>JONES</lastName>
<company>Jones Enterprises</company>
</role>
<role xsi:type="director">
<firstName>Thomas</firstName>
<lastName>TEST</lastName>
<company>Test Factory</company>
</role>
</xml>
EOT
FIRSTNAME = 'Thomas'
LASTNAME = 'JONES'
roles = doc.search("//role[child::firstName[text()[contains(., 'Thomas')]] and child::lastName[text()[contains(., 'JONES')]]]")
puts roles.to_xml
# >> <role xsi:type="director">
# >> <firstName>Thomas</firstName>
# >> <lastName>JONES</lastName>
# >> <company>Jones Enterprises</company>
# >> </role>
您可以用 CSS 做同样的事情,只是 CSS 不允许我们使用逻辑在同一个 libXML 调用中测试两个子节点的内容。相反,在那个时候,我们必须进行多次调用,让 Ruby 和 Nokogiri 过滤所需的节点,这变得更加困难和 CPU 密集型。像这样的东西有效:
roles_firstnames = doc.search('role firstName:contains("Thomas")').map(&:parent)
roles_lastnames = doc.search('role lastName:contains("JONES")').map(&:parent)
matching_roles = (roles_firstnames & roles_lastnames)
puts matching_roles.map(&:to_xml)
# >> <role xsi:type="director">
# >> <firstName>Thomas</firstName>
# >> <lastName>JONES</lastName>
# >> <company>Jones Enterprises</company>
# >> </role>
注意事项:
:contains
.roles_firstnames & roles_lastnames
让 Ruby 在数组上使用集合交集。每个数组都包含一个包含名字或姓氏的节点列表。每个条目都是父节点的标识符。 &
简化测试以查看两个数组中的哪些节点是共同的,并且基本上执行 and
其次是 uniq
对我们来说。无论采用哪种方式,一旦您拥有 <role>
需要的节点,很容易遍历它们并提取子节点 <company>
节点的文本:
roles.map{ |n| n.at('company').text }
# => ["Jones Enterprises"]
关于ruby-on-rails - 如何使用 Nokogiri 过滤数组(搜索、过滤、条件等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27220679/
我在 OSX 上使用 RVM 和之前的 RBENV。我在 ./gems 中相对于我的项目路径安装了我的 gems 我正在使用 aws-sdk 并尝试使用 s3 客户端导致 nokogiri/nokog
我正在尝试使用以下版本在 Mac OS Big Sur 上构建 Rails 应用程序...... $ rails --version Rails 5.0.7.2 $ ruby --version ru
我正在尝试抓取 http://www.ign.com/games/reviews使用 Nokogiri,我想实例化与页面上每个游戏评论相对应的新评论对象。当然,我还想从每条评论中获取每个数字分数,并将
我正在编写 Lynda 的 Ruby on Rails 教程,一切都按预期进行。所有安装和一切都运行完美。 但是创建项目后,当我尝试启动服务器(cmd:rails server)时,我收到错误消息:
尝试按如下方式在生产模式下运行 rake Assets 预编译。 rake assets:precompile 它在 ubuntu 14.04(32 位)和 16.06(32 位)上运行良好。但是在
我需要一种方法来运行 nokogiri 脚本 #parser.rb require 'nokogiri' def parseit() //... end 并在 jruby 的 main.rb 下面运行
在解析缩进的 XML 时,不重要的空白文本节点是从结束标记和开始标记之间的空白创建的。例如,来自以下 XML: Tove Jani Reminder Don't forget me
Nokogiri 在我的 gem 文件中。 bundle 安装返回预期的输出: Using nokogiri (1.4.4) Your bundle is complete! Use `bundle
我安装了 Ruby 和 Nokogiri gem。在 irb 中,我尝试: require 'nokogiri' require 'open-uri' url = 'http://www.amazon
我想使用 XSL 将 XML 文档转换为 HTML,稍微修改一下,然后将其呈现出来。这基本上就是我正在做的: source = Nokogiri::XML(File.read 'source.xml'
我的 Ruby on Rails 应用程序使用 Rails 2.2.2 和 Ruby 1.8.7。 尝试运行时 RAILS_ENV=production rake gems:install 或任何佣金
在 IRB 中,当我键入 require“nokogiri”时,出现以下错误: LoadError: cannot load such file -- nokogiri 我的 gemfile 中安装了
我正在使用 DevKit 在 Windows 8.1 上运行全新安装的 Ruby 2.2.1。安装后我运行: gem install rails rails new testapp cd testap
我正在尝试安装 nokogiri,因为它是启动 rails 所必需的 $ rails s /usr/local/rvm/gems/ruby-1.9.3-p194@global/gems/bun
我终于设法解析了网站的部分内容: get '/' do url = '' data = Nokogiri::HTML(open(url)) @rows = data.css("td[val
我第一次使用 Nokogiri 搜索 HTML 文档。当我创建一个变量(并打印)时,它等于: beteween Nokogiri::HTML(open(url).read) 它似乎输出与完全相同的东西
如果我尝试安装 nokogiri,我会收到以下错误: rvmsudo gem install nokogiri ERROR: Error installing nokogiri: nokog
我在屏幕抓取 rake 任务中有以下代码 page = agent.get("https://domainname.co.uk/unit/27/logs?type=incoming&page=8")
我尝试(出于测试目的)解析 Google 商家 XML 提要,定义为: EasyOptic 2014-08-01T16:31:
如何将“foo”替换为“bar”? 来自 foo1foo2foo4foo5foo6 至 bar1bar2bar4bar5bar6 我只想替换标签内部内容,没有标签属性。 有什么想法吗? 最佳答案 re
我是一名优秀的程序员,十分优秀!