【问题标题】:How to match all namespace's element by NokogiriNokogiri 如何匹配所有命名空间的元素
【发布时间】:2017-02-10 04:36:15
【问题描述】:

我想找一个这样的元素。

xml1 = '<period>2017-02-10</period>'

xml2 = <<XML
<root xmlns:xbrli="http://www.w3.org/1999/xhtml">
  <xbrli:period>2017-02-10</period>
</root>
XML

我可以通过以下方式选择元素:

  def period_from_xml(xml)
    doc = Nokogiri::XML(xml)
    period_element = if doc.namespaces.keys.include?('xmlns:xbrli')
      doc.at_css("xbrli|period")
    else
      doc.at_css("period")
    end
  end

  period_from_xml(xml1)
  # => <period>2017-02-10</period>
  period_from_xml(xml2)
  # => <xbrli:period>2017-02-10</period>

我知道Nokogiri::XML::Document#remove_namespaces!,但我不想使用它,因为另一个地方我需要它。

也许复制docdoc_without_namespaces 是个好主意?

有没有简单易行的方法来处理这种情况?

【问题讨论】:

标签: ruby namespaces nokogiri


【解决方案1】:

我会用这个:

require 'nokogiri'

xml = <<EOT
<root xmlns:xbrli="http://www.w3.org/1999/xhtml">
  <period>2017-02-10</period>
  <xbrli:period>2017-02-11</period>
</root>
EOT

doc = Nokogiri::XML(xml)

doc.search('period,xbrli|period').map(&:text) # => ["2017-02-10", "2017-02-11"]

'period,xbrli|period' 在 CSS 中的意思是“找到 "period""xbrli:period"

另见“How to avoid joining all text from Nodes when scraping”。

【讨论】:

  • 抱歉,我的第一个问题没有足够的信息来说明我想知道的内容。我编辑了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 2014-02-17
  • 2016-04-24
相关资源
最近更新 更多